Это время в то время в этом году, когда в последнем выпуске Python Alpha Release Rolls и первая бета-версия находится на пути, так что это идеальное время, чтобы сделать новую версию Python для поездки и посмотреть, какие крутые новые функции входят – на этот раз вокруг – в Python 3.10!
Установка альфа/бета-версия
Если вы хотите попробовать все функции последней и величайшей версии Python, вам нужно будет установить Альфа/бета версия. Однако, учитывая, что это еще не стабильная версия, мы не хотим перезаписать нашу установку Python по умолчанию. Итак, чтобы установить Python 3.10 наряду с нашим текущим интерпретатором, мы можем использовать следующее:
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0a6.tgz tar xzvf Python-3.10.0a6.tgz cd Python-3.10.0a6 ./configure --prefix=$HOME/python-3.10.0a6 make make install $HOME/python-3.10.0a6/bin/python3.10
После запуска вышеуказанного кода вы будете приветствовать Python 3.10 Alpha Stled:
Python 3.10.0a6 (default, Mar 27 2021, 11:50:33) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
С Python 3.10 установлен, мы можем взглянуть на все новые функции и изменения …
Тип проверки улучшений
Если вы используете тип проверки в Python, вы будете рады услышать, что Python 3.10 будет включать в себя множество типовых улучшений, в том числе Тип Union Оператор С помощью чистого синтаксиса:
# Function that accepts either `int` or `float` # Old: def func(value: Union[int, float]) -> Union[int, float]: return value # New: def func(value: int | float) -> int | float: return value
Кроме того, это простое улучшение не ограничивается только для типа аннотаций, но также можно использовать с Isinstance ()
и iSsubclass ()
Функции:
isinstance("hello", int | str) # True
Тип псевдонимов синтаксис изменения
В ранее Версии Python Добавлены псевдонимы типа, чтобы позволить нам создавать псевдонимы, которые представляют пользовательские типы. В Python 3.9 или раньше это будет сделано так:
FileName = str def parse(file: FileName) -> None: ...
Здесь Имя файла
является псевдоним для базового типа Stringon. Начиная с Python 3.10, хотя синтаксис для определения псевдонимов типа изменится на следующее:
FileName: TypeAlias = str def parse(file: FileName) -> None: ...
Это простое изменение облегчит как для программистов, так и для шашки типа, чтобы различать обычное переменное назначение и псевдонимами типа. Это изменение также является совместимым назад, поэтому вам не нужно обновлять какой-либо из вашего существующего кода, который использует псевдонимы типа.
Помимо этих двух изменений, есть и другие улучшения модуля набора текста – а именно Переменные спецификации параметров в PEP 612 Отказ Это, однако, не на самом деле не то, что вы найдете в большинстве кодовых базах Python, поскольку они используются для пересылки типов параметров одного Callable к другому Callable (например, в декораторах). Если у вас есть корпус для такой вещи, хотя посмотрите указанный выше.
Численность населения
Начиная с Python 3.10, вы можете использовать int.bit_count ()
Рассчитать счетчик битов (количество одного) в двоичном представлении целого числа. Это также известно как Количество населения (попс) :
value = 42 print(bin(value)) # '0b101010' print(value.bit_count()) # 3
Это определенно приятно, но давайте будем настоящим, реализуя эту функцию не совсем сложно, это действительно только одна строка кода:
def bit_count(value): return bin(value).count("1")
С этим сказанным, это еще одна удобная функция, которая может пригодиться в какой-то момент, и эти виды полезных небольших особенностей являются одной из причин, почему Python настолько популярен – казалось бы, все доступно из коробки.
Динутиты устаревают
С новой версией вещи не только добавляются, но также устарели/удалены. Это дело для Идутилс
Пакет, который устарел в 3.10 и будет удален в 3.12. Этот пакет был заменен на Seturgools.
и Упаковка
на некоторое время сейчас, Так что, если вы используете любой из них, то вы должны быть в порядке. С этим сказанным, вы, вероятно, должны проверить свой код для использования Идутилс
И начните готовиться, чтобы избавиться от этого в ближайшее время.
Context Manager Syntax.
Менеджеры контекста Python отлично подходят для открытия/закрытия файлов, обрабатывая соединения баз данных и много других вещей, а в Python 3.10 их синтаксис получит небольшое качество улучшения жизни. Это изменение позволяет менеджерам контекста в скобках выполнять несколько строк, что удобно, если вы хотите создать многие из них в Single с
утверждение:
with ( open("somefile.txt") as some_file, open("otherfile.txt") as other_file, ): ... from contextlib import redirect_stdout with (open("somefile.txt", "w") as some_file, redirect_stdout(some_file)): ...
И, как вы можете видеть из вышеперечисленного, мы можем даже ссылаться на переменную, созданную одним менеджером контекста ( ... как uvery_file
) в другом, следующий за ним!
Это всего лишь 2 из множества новых форматов, доступных в Python 3.10. Этот улучшенный синтаксис довольно гибкий, поэтому я не буду надоедать каждый возможный вариант форматирования, так как я уверен, что все, что вы бросаете на Python 3.10, это, скорее всего, просто будет работать.
Улучшения производительности
Как и в случае со всеми недавними релизами Python, Python 3.10 также приносит некоторые улучшения производительности. Сначала их оптимизация str ()
, Байты ()
и ByTearRay ()
Конструкторы, которые должны составлять около 30% быстрее (фрагмент, адаптированные из Python Bug Tracker Пример ):
~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "str()" Mean +- std dev: [python] 81.9 ns +- 4.5 ns -> [python3.10] 60.0 ns +- 1.9 ns: 1.36x faster (-27%) ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytes()" Mean +- std dev: [python] 85.1 ns +- 2.2 ns -> [python3.10] 60.2 ns +- 2.3 ns: 1.41x faster (-29%) ~ $ ./python3.10 -m pyperf timeit -q --compare-to=python "bytearray()" Mean +- std dev: [python] 93.5 ns +- 2.1 ns -> [python3.10] 73.1 ns +- 1.8 ns: 1.28x faster (-22%)
Еще одна более заметная оптимизация (если вы используете аннотации типа), заключается в том, что параметры функции и их аннотации больше не рассчитаны во время выполнения, а скорее во время компиляции. Теперь это делает его в 2 раза быстрее, чтобы создать функцию с аннотациями параметров.
Кроме того, есть еще несколько оптимизаций в различных частях ядра Python. Вы можете найти особенности о своих следующих вопросах в Python Bug Tracker: BPO-41718 , BPO-42927 и BPO-43452 Отказ
Сопоставление картины
Одна большая особенность, о которой вы обязательно уже слышали о том, что Структурное образец сопоставления Отказ Это добавит дело
Заявление, которое мы все знаем с других языков программирования. Мы все знаем, как использовать дело
заявление, но, учитывая, что это Python – это не просто обычный Переключатель/чехол Синтаксис, но он также добавляет некоторые мощные функции вместе с ней, что мы должны исследовать.
Сопоставление картины в его основной форме состоит из Матч
ключевое слово, за которым следуют выражение, результат которого затем протестирован против шаблонов в последовательных дело
заявления:
def func(day): match day: case "Monday": return "Here we go again..." case "Friday": return "Happy Friday!" case "Saturday" | "Sunday": # Multiple literals can be combined with `|` return "Yay, weekend!" case _: return "Just another day..."
В этом простом примере мы используем день
переменная как наше выражение, которое тогда сравнивается с отдельными строками в дело
заявления. Помимо дело
с строковыми литералами, вы также заметите последнее дело
который использует _
подстановочный знак , что эквивалентно дефолт
Ключевое слово, присутствующее на других языках. Этот кейс подстановочного знака может быть опущен, хотя, и в этом случае может произойти NO-OP, что по существу означает, что Нет
возвращается.
Еще одна вещь, чтобы заметить в коде выше, это использование |.
что позволяет объединить несколько литералов, используя |.
( или ) Оператор.
Как я уже упоминал, это новое сопоставление шаблона не заканчивается основным синтаксисом, а скорее приносит некоторые дополнительные функции, такие как сопоставление сложных шаблонов:
def func(person): # person = (name, age, gender) match person: case (name, _, "male"): print(f"{name} is man.") case (name, _, "female"): print(f"{name} is woman.") case (name, age, gender): print(f"{name} is {age} old.") func(("John", 25, "male")) # John is man.
В приведенном выше фрагменте мы использовали кортеж
как выражение, чтобы соответствовать. Мы, однако, не ограничиваются использованием кортежей – любая съемка будет работать здесь. Кроме того, как вы можете видеть выше, _
Подстановочный знак также можно использовать внутри комплексных узоров, а не только сам по себе, как и в предыдущем примере.
Использование простых кортежей или списков не всегда является лучшим подходом, поэтому, если вы предпочитаете использовать классы вместо этого, то это можно переписать следующим образом:
from dataclasses import dataclass @dataclass class Person: name: str age: int gender: str def func(person): # person is instance of `Person` class match person: # This is not a constructor case Person(name, age, gender) if age < 18: # guard for extra filtering print(f"{name} is a child.") case Person(name=name, age=_, gender="male"): # Wildcard ("throwaway" variable) can be used print(f"{name} is man.") case Person(name=name, age=_, gender="female"): print(f"{name} is woman.") case Person(name, age, gender): # Positional arguments work print(f"{name} is {age} years old.") func(Person("Lucy", 30, "female")) # Lucy is woman. func(Person("Ben", 15, "male")) # Ben is a child.
Здесь мы видим, что можно соответствовать атрибутам класса с шаблонами, которые напоминают конструктор класса. При использовании этого подхода также индивидуальные атрибуты захватываются в переменные (то же самое, что и с тем, что с тем, что при использовании кортежей), которые мы можем затем использовать в соответствующей дело
Тело.
Выше мы также можем увидеть некоторые другие функции сопоставления шаблонов – в первом дело
утверждение Это охранник , что является Если
Условный, который следует за рисунком. Это может быть полезно, если сопоставление по значению недостаточно, и вам нужно добавить некоторые дополнительные условные проверки. Глядя на оставшийся дело
S здесь, мы также можем увидеть, что оба ключевое слово (например, имя = имя
) и позиционные аргументы работают с этим Конструктор – как Синтаксис, а также же идет на _
(подстановочный знак или «сбросить» ) переменную.
Сопоставление шаблона также позволяет использовать вложенные узоры. Эти вложенные модели могут использовать любые намеки, как с Конструктор – как объекты или более поручено внутри них:
match users: case [Person(...)]: print("One user provided...") case [Person(...), Person(...) as second]: # `as var` can be used to capture subpattern print(f"There's another user: {second}") case [Person(...), Person(...), *rest]: # `*var` can be used as unpacking print(...)
В таких видах сложных моделей могут быть полезны для захвата подразделения в переменную для дальнейшей обработки. Это можно сделать с помощью как
Ключевое слово, как показано во втором дело
выше.
Наконец, *
Оператор может быть использован для “Распаковать” Переменные в шаблоне, это также работает с _
Подстановочный знак с использованием * _
шаблон.
Если вы хотите увидеть больше примеров и полного учебника, затем проверьте PEP 636 Отказ
Закрытие мыслей
Python 3.10 приносит много интересных новых функций, но это быть Альфа (И вскоре, чтобы быть Beta ) Выпуск, он все еще далеко от полностью проверенного и добычи. Поэтому определенно не очень хорошая идея начать использовать его только. Итак, это, вероятно, лучше всего сидеть и ждать полного выпуска в октябре и, возможно, проверьте Что нового в Python 3.10 страница Время от времени для любых последних дополнений.
С этим сказанным – если вы хотите обновить – это не может быть плохой идеей, чтобы схватить первую Бета Выпуск (приходит где-то в июне) и возьмите его для теста, чтобы посмотреть, совместим ли ваша существующая кодовая база со всеми входящими изменениями, амортизациями или удалением функций/модулей.
Оригинал: “https://dev.to/martinheinz/all-the-important-features-and-changes-in-python-3-10-57fc”