Что нового в Python 3.9?

Эта статья описывает новые возможности и содержит список изменений Python 3.9 по сравнению с Python 3.8.

Дата релиза Python 3.9 — 5 октября 2020 года

Каждый релиз Python включает в себя новые и улучшенные функции, происходит оптимизация кода и устаревают разных функции, а иногда и целые библиотеки. В статье приведён не полный список изменений. Ниже будет подробно рассмотрен новый функционал, которые предлагает последняя версия Python.

Если вы хотите ознакомиться с полным списком изменений, обратитесь к официальной документации на Python.org

Новые возможности

Слияния и обновления словарей

Операторы merge (|) и update (|=) были добавлены в стандартный класс dict. Они дополняют существующие dict.update и {**a, **b} метод объединения словарей.

a = {"Ключ 1": "Значение 1", "Ключ 2": "Значение 2"}
b = {"Ключ 3": "Значение 3", "Ключ 4": "значение 4"}

a | b
{'Ключ 1': 'Значение 1', 'Ключ 2': 'Значение 2', 'Ключ 3': 'Значение 3', 'Ключ 4': 'значение 4'}

b | a
{'Ключ 3': 'Значение 3', 'Ключ 4': 'значение 4', 'Ключ 1': 'Значение 1', 'Ключ 2': 'Значение 2'}

Полное описание доступно в PEP 584.

Удаления префиксов и суффиксов из строк

Для этого используются новые строковые методы str.removeprefix() и str.removesuffix(), они позволяют легко удалять ненужный префикс или суффикс из содержимого строки.

str = "https://egorovegor.ru
str.removeprefix('https://')

'egorovegor.ru'

str.removesuffix('.ru') 

'https://egorovegor'

Полное описание доступно в PEP 616.

Упрощение указание типов для коллекций

В аннотациях доступно к использованию стандартные типы коллекций, например list и dict вместо импорта соответствующих типов (например, List или Dict) из модуля стандартной библиотеки typing. Некоторые другие типы в стандартной библиотеке теперь также являются общими, например, queue.Queue.

def get_all_city_id(city_id: list[int]) -> None:
    for c in city_id:
        print(c)

Новый парсер

В Python 3.9 появился новый парсер, основанный на PEG вместо LL. Скорость работы нового парсера примерно сравнима с производительностью старого, но формализм PEG более гибкий, чем LL, когда речь заходит о разработке новых возможностей языка. Мы начнем использовать эту гибкость в Python 3.10

Библиотека ast уже использует PEG

В Python 3.10 старый синтаксический анализатор будет удален, как и вся функциональность, которая от него зависит (в первую очередь, модуль синтаксического анализатора).

Эта статья описывает новые возможности и содержит список изменений Python 3.9 по сравнению с Python 3.8.

Только на Python 3.9 вы можете переключиться обратно на парсер LL, используя переключатель командной строки (-X oldparser) или переменную окружения (PYTHONOLDPARSER=1).

Полное описание доступно в PEP 617.

Список более мелких изменений

  • Функция import() теперь поднимает исключение ImportError вместо ValueError, в ошибке указания относительного пути для импорта
  • Теперь Python возвращает абсолютный путь имени файла, указанного в командной строке (ex: python3 script.py): атрибут __file__ модуля __main__ стал абсолютным, а не относительным путем.
  • В режиме разработки Python и в отладочной сборке кодировка и аргументы об ошибках теперь проверяются на наличие операций кодирования и декодирования строк. Примеры: open(), str.encode() и bytes.decode().
  • «Книга».replace(«текст», var, n) теперь возвращает var вместо пустой строки для всех ненулевых n.
  • Любое валидное выражение теперь доступно для использования в качестве декоратора. Раньше грамматика была гораздо более ограниченной. PEP614
  • Параллельный запуск aclose() / asend() / athrow() теперь запрещен, а запуск ag_running теперь отражает реальное состояние работы генератора асинхронизации.

Новые библиотеки

zoneinfo

Модуль zoneinfo внедряет поддержку базы данных временных поясов IANA в дефолтный набор батареек Python. Появляется метод zoneinfo.ZoneInfo, реализующий datetime.tzinfo, с подкрепленными данными о временном поясе системы.

from zoneinfo import ZoneInfo
from datetime import datetime

dt = datetime(2021, 1, 7, 23, 15, tzinfo=ZoneInfo("Europe/Moscow"))

print(dt)
2021-01-07 23:15:00+03:00

dt.tzname()
'MSK'

graphlib

Добавлен новый модуль graphlib, который содержит класс graphlib.TopologicalSorter, предлагающий функциональность для выполнения топологической сортировки графиков.

Изменения в библиотеках

ftplib

FTP и FTP_TLS теперь поднимают исключение ValueError, если заданный таймаут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета.

http

Добавлены новые http статусы

  • 103 EARLY_HINTS
  • 418 IM_A_TEAPOT
  • 425 TOO_EARLY

imaplib

Так же у меня есть группа ВКонтакте @yegorovegor. Обязательно подпишись!

IMAP4 и IMAP4_SSL теперь имеют дополнительный параметр таймаута для своих конструкторов. Также, метод open() теперь имеет опциональный параметр таймаута с этим изменением.

poplib

POP3 и POP3_SSL теперь поднимают исключение ValueError, если заданный таймаут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета.

smtplib

SMTP и SMTP_SSL теперь поднимает исключение ValueError, если заданный таймаут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета.

ipaddress

ipaddress теперь поддерживает IPv6 Scoped Addresses (IPv6 адрес с суффиксом %).

Скопированные IPv6 адреса могут быть разобраны с помощью ipaddress.IPv6Address. Если присутствует, то идентификатор зоны scope_id доступен через атрибут scope_id.

venv

Скрипты активации, предоставленные venv, теперь все последовательно указывают свою подсказку, всегда используя значение, указанное VENV_PROMPT. Раньше некоторые скрипты безоговорочно использовали VENV_PROMPT, другие только в случае, если это произошло (что было по умолчанию), и один из них использовал VENV_NAME.

close

Изучаешь Python?

Оформи подписку и получи моментальный доступ к новым публикациям

Обязательно прочитайте другие статьи посвященные языку программирования Python


GeekUniversity - обучение до уровня Middle с гарантированным трудоустройством


Добавить комментарий

Ваш адрес email не будет опубликован