Выход стабильной версии Python 3.9.0

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Сегодня, 05.10.2020 ожидается выход стабильной версии Python 3.9.0. Новая версия будет получать обновления с исправлениями примерно каждые 2 месяца в течение примерно 18 месяцев. Через некоторое время после выпуска финальной версии 3.10.0 будет выпущено девятое и последнее обновление с исправлением ошибок 3.9.

Я прочитал примечания к выпуску Python 3.9 и связанные с ними обсуждения. Основываясь на информации, я хотел написать исчерпывающее руководство, чтобы каждый мог получить представление о функциях вместе с их подробной работой.

PEP 584


Этот PEP предлагает добавить операторы слияния ( | ) и обновления ( | = ) во встроенный класс dict.

Для слияния: |

>>> a = {'milk': 'prostokvashino', 'сheese': 'cheddar'} 
>>> b = {'milk': 1, 'сheese': 2, 'bread': 3} 
>> > а | b 
{'milk': 1, 'сheese': 2, 'bread': 3}
>>> b | a 
{'milk': 'prostokvashino', 'сheese': 'cheddar', 'bread': 3}

Для обновления: |=

>>> a | = b 
>>> a 
{'milk': 1, 'сheese': 2, 'bread': 3}

Ключевое правило, которое следует запомнить, заключается в том, что если есть какие-либо конфликты ключей, то самое правое значение будет сохранено.

Безусловно, у многих питонистов возникнет вопрос, зачем это нужно, если уже есть привычный всем вариант

{** d1, ** d2}

На этот вопрос были даны ответы в самом PEP:

Распаковка диктовки выглядит некрасиво, и ее нелегко обнаружить. Мало кто сможет догадаться, что это означает, когда они впервые увидят это.

Как сказал Гвидо:
Прошу прощения за PEP 448, но даже если вы знаете о ** d в более простом контексте, если бы вы спросили типичного пользователя Python, как объединить два dicts в новый, я сомневаюсь, что многие люди подумают о {** d1, ** d2}. Я знаю, что сам забыл об этом, когда началась эта ветка!

PEP 585


Generics подсказки типов в стандартных коллекциях.

Generic — тип, который можно параметризовать, некий контейнер. Также известен как параметрический тип или универсальный тип.

В выпуске включена поддержка универсального синтаксиса во всех стандартных коллекциях, доступных в настоящее время в модуле набора текста. Мы можем использовать типы list или dict встроенные коллекции в качестве универсальных типов вместо использования typing.List или typing.Dict в сигнатуре нашей функции.

Было:

from typing import List

a: List[str] = list()

def read_files(files: List[str]) -> None:
    pass

Стало:

a: list[str] = list()

def read_files(files: list[str]) -> None:
    pass

Полный список типов
tuple
list
dict
set
frozenset
type
collections.deque
collections.defaultdict
collections.OrderedDict
collections.Counter
collections.ChainMap
collections.abc.Awaitable
collections.abc.Coroutine
collections.abc.AsyncIterable
collections.abc.AsyncIterator
collections.abc.AsyncGenerator
collections.abc.Iterable
collections.abc.Iterator
collections.abc.Generator
collections.abc.Reversible
collections.abc.Container
collections.abc.Collection
collections.abc.Callable
collections.abc.Set # typing.AbstractSet
collections.abc.MutableSet
collections.abc.Mapping
collections.abc.MutableMapping
collections.abc.Sequence
collections.abc.MutableSequence
collections.abc.ByteString
collections.abc.MappingView
collections.abc.KeysView
collections.abc.ItemsView
collections.abc.ValuesView
contextlib.AbstractContextManager # вместо typing.ContextManager
contextlib.AbstractAsyncContextManager # вместо typing.AsyncContextManager
re.Pattern # вместо typing.Pattern, typing.re.Pattern
re.Match # вместо typing.Match, typing.re.Match

PEP 615


Поддержка базы данных часовых поясов IANA в стандартной библиотеке.

IANA часовые пояса часто называют tz или zone info. Существует большое количество часовых поясов IANA с разными путями поиска для указания часового пояса IANA для объекта даты и времени. Например, мы можем передать имя пути поиска как Континент/Город datetime объекту, чтобы установить его tzinfo.

dt: datetime = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))

Если мы передадим неверный ключ, будет вызвано исключение
zoneinfo.ZoneInfoNotFoundError

PEP 616


Новые строковые функции для удаления префикса и суффикса.

К str объекту добавлены две новые функции.

  • Первая функция удаляет префикс.
    str.removeprefix(prefix)
  • Вторая функция удаляет суффикс.
    str.removesuffix(suffix)

>>> 'hello_world'.removeprefix (' hello_') 
world
>>> 'hello_world'.removesuffix ('_world') 
hello

PEP 617


Версия Python 3.9 предлагает заменить текущий синтаксический анализатор Python на основе LL (1) новым синтаксическим анализатором на основе PEG, который является высокопроизводительным и стабильным.

Текущий парсер CPython основан на LL (1). Впоследствии грамматика основана на LL (1), что позволяет анализировать ее с помощью анализатора LL (1). Парсер LL (1) работает сверху вниз. Кроме того, он анализирует входные данные слева направо. Текущая грамматика является контекстно-свободной грамматикой, поэтому контекст токенов не принимается во внимание.
Версия Python 3.9 предлагает заменить его новым парсером на основе PEG, что означает, что он снимет текущие ограничения Python грамматики LL (1). Кроме того, в текущий синтаксический анализатор внесены исправления, в которые добавлен ряд хаков, которые будут удалены. В результате это снизит стоимость обслуживания в долгосрочной перспективе.

Например, хотя синтаксические анализаторы и грамматики LL (1) просты в реализации, ограничения не позволяют им выражать общие конструкции естественным образом для разработчика языка и читателя. Парсер смотрит только на один токен вперед, чтобы различать возможности.

issue30966


Возможность отмены одновременных фьючерсов.

Новый параметр cancel_futuresбыл был добавлен в concurrent.futures.Executor.shutdown().

В этом параметре все отложенные фьючерсы, которые еще не начались. До версии 3.9 процесс ожидал их завершения перед завершением работы исполнителя.

Новый параметр cancel_futures был добавлен в ThreadPoolExecutor и ProcessPoolExecutor. Это работает, когда значение параметра равно True, тогда все ожидающие фьючерсы будут отменены при вызове функции shutdown().

Когда shutdown() выполняется, интерпретатор проверяет, не собран ли исполнитель сборщиком мусора. Если он все еще находится в памяти, он получает все ожидающие обработки элементы, а затем отменяет фьючерсы.

issue30966


В этом выпуске в библиотеку asyncio и multiprocessing был внесен ряд улучшений.

Например,

  1. reuse_address параметр asyncio.loop.create_datagram_endpoint() больше не поддерживаются из — за значительных проблем в области безопасности.
  2. Добавлены новые coroutines, shutdown_default_executor() и сопрограммы asyncio.to_thread(). Новый вызов asyncio.to_thread() используется для запуска функций, связанных с вводом-выводом, в отдельном потоке, чтобы избежать блокировки цикла событий.

Что касается улучшений библиотеки multiprocessing, в multiprocessing.SimpleQueue класс был добавлен новый метод close().

Этот метод явно закрывает очередь. Это гарантирует, что очередь будет закрыта и не останется дольше ожидаемого. Важно помнить, что методы get(), put(), empty() нельзя вызывать после закрытия очереди.

issue37444


Исправление ошибки импорта пакетов.

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

builtins.__import__() вызывал ValueError то время как importlib.__import__() вызывал ImportError.

Сейчас это исправлено, . __Import __ () теперь вызывает ImportError вместо ValueError.

issue40286


Генерация случайных байтов.

Еще одна функция, которая была добавлена ​​в версии 3.9, — это random.Random.randbytes(). Она может использоваться для генерации случайных байтов.

Мы можем генерировать случайные числа, но что, если нам нужно было генерировать случайные байты? До версии 3.9 разработчикам приходилось проявлять изобретательность, чтобы генерировать случайные байты. Хотя мы можем использовать, os.getrandom(), os.urandom() или secrets.token_bytes() но не можем генерировать псевдослучайные шаблоны.

Например, чтобы гарантировать, что случайные числа генерируются с ожидаемым поведением и процесс воспроизводится, мы обычно используем seed с модулем random.Random.

В результате был введен метод random.Random.randbytes(). Он генерирует случайные байты.

issue28029


Исправление функции замены строки.

Принцип replace работы функции заключается в том, что для заданного максимального аргумента замены вхождения она заменяет набор символов из строки новым набором символов.

Чтобы дополнительно объяснить проблему, до версии 3.9 replace функция имела несогласованное поведение:

"" .replace ("", "blog", 1) 
>>> '' 

Можно было бы ожидать увидеть blog:

"" .replace ("", "|", 1) 
>>> '' 

Можно было бы ожидать увидеть |

"" .replace ("", "prefix") 
>>> 'prefix'

Благодарю за внимание.

Ссылка на официальное руководство Python 3.9.
Отпишитесь в комментарии, если что-то было упущено.
Источник: https://habr.com/ru/post/522170/


Интересные статьи

Интересные статьи

Мы рады представить январский релиз 2020 расширения Python для Visual Studio Code. Вы можете скачать расширение из маркетплейса, или установить его напрямую из галереи расширений в Visual Studio ...
Привет, Хабр! Представляю вашему вниманию перевод статьи "Introduction to ASGI: Emergence of an Async Python Web Ecosystem" автора Florimond Manca. "Черепахи рядом с водоемом&qu...
Привет, Хабр! Представляю вашему вниманию перевод статьи “Object-Oriented Programming in Python vs Java” автора Джона Финчера. Реализация объектно-ориентированного программирования (ООП) в языка...
Основанная в 1998 году компания «Битрикс» заявила о себе в 2001 году, запустив первый в России интернет-магазин программного обеспечения Softkey.ru.