[Python] Выход стабильной версии Python 3.9.0
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Сегодня, 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
Полный список типов
SPL
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 был внесен ряд улучшений.
Например,
- reuse_address параметр asyncio.loop.create_datagram_endpoint() больше не поддерживаются из — за значительных проблем в области безопасности.
- Добавлены новые 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.
Отпишитесь в комментарии, если что-то было упущено.
===========
Источник:
habr.com
===========
Похожие новости:
- [Python, Машинное обучение, Искусственный интеллект, TensorFlow] Подборка статей о машинном обучении: кейсы, гайды и исследования за сентябрь 2020
- [Разработка веб-сайтов, Python, Django] Отношение один к одному: связывание модели пользователя с кастомной моделью профиля в Django (перевод)
- [Python] Формат таблиц в pandas
- [Python] Простейший голосовой помощник на Python
- [Тестирование IT-систем, Python, Тестирование веб-сервисов] Robot Framework vs Pytest
- [Python, Математика, Машинное обучение, Научно-популярное, Мозг] Новый способ изучения психотропных веществ с помощью ЭЭГ и нейронных сетей
- [Python, Машинное обучение] OpenVINO становится «серебряной пулей» хакатонов по компьютерному зрению
- [Data Mining, Python, Анализ и проектирование систем] Process Mining без PM4PY
- [MongoDB, Node.JS, Python] Top 10 Full Stack Development Companies to Check Out in 2020
- [API, Python, ВКонтакте API] Бот для автопостинга VK
Теги для поиска: #_python, #_python_3.9, #_novosti (новости), #_python
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 06:28
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Сегодня, 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 Полный список типовSPLtuple
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
Новые строковые функции для удаления префикса и суффикса. К str объекту добавлены две новые функции.
>>> '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 был внесен ряд улучшений. Например,
Что касается улучшений библиотеки 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. Отпишитесь в комментарии, если что-то было упущено. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 06:28
Часовой пояс: UTC + 5