Рубрики
Без рубрики

Все важные особенности и изменения в Python 3.10

Это время в то время года, когда последний роллы Python Alpha Release Rolls и первая бета-версия находится на … Теги с Python.

Это время в то время в этом году, когда в последнем выпуске 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”