10 классных функций Python 3.9
Новая версия популярного языка программирования вышла не так давно. Рассмотрим наиболее интересные возможности Python 3.9, на которые стоит обратить внимание как новичкам, так и профессионалам. Обсудить Перевод подготовлен совместно с факультетом Python-разработки GeekBrains. Автор оригинального текста Farhad Malik. *** Как и большинство поклонников Python, я очень рад изучать и использовать новейшие функции. В этой статье будет представлен обзор возможностей Python 3.9, которые необходимо знать. Я ознакомился с примечаниями к выпуску, посмотрел обсуждения и составил исчерпывающий гайд о том, что из себя представляют эти функции и как они работают. *** Было добавлено несколько новых функций, включая объединение и обновление словарей, строковые методы и внедрение модуля zoneinfo. Также нам представили стабильный и высокопроизводительный парсер. Давайте разбираться с нововведениями. Во встроенный класс | используется для объединения словарей, |= – для их обновления. PEP 584 Код: Объединение: Обновление: В случае конфликта ключей верным будет считаться крайнее правое значение. Это соответствует поведению аналогичных операций Как мы видим, добавлены новые операторы В Python 3.8 есть несколько способов слияния и обновления словарей. К примеру, можно использовать Также мы можем применить Этот способ не работает с подклассами Наконец, библиотека collections содержит функцию *** Для получения более подробной информации вы можете ознакомиться с источником. https://www.python.org/dev/peps/pep-0584 С Python 3.9 можно отказаться от использования LL (1) в пользу более гибкого и стабильного синтаксического анализатора на основе PEG. PEP: 617 Текущий парсер CPython основан на LL (1). Грамматика основана на LL (1), что позволяет парсить ее с помощью LL (1) анализатора. Парсер LL (1) работает сверху вниз и анализирует входные данные слева направо. Грамматика является контекстно-свободной, поэтому контекст токенов не учитывается. Python 3.9 предлагает заменить его новым парсером на основе PEG, который снимет ограничения Python грамматики LL (1). Будет удален ряд хаков, существующих в текущем синтаксическом анализаторе. В долгосрочной перспективе это снизит стоимость обслуживания. Несмотря на то, что синтаксические анализаторы и грамматики LL (1) просты в реализации, ограничения не позволяют им выражать общие конструкции естественным образом для разработчика языка и читателя. Парсер смотрит только на один токен вперед, чтобы различать возможности. Оператор выбора | упорядоченный. Рассмотрим следующее правило: Контекстно-свободный парсер грамматики LL (1) будет генерировать конструкции, которые при заданной входной строке определят, нужно ли расширять A, B или C. Анализатор PEG отличается. Он проверит, успешна ли первая переменная, и только в случае провала перейдет ко второй или третьей. Парсер PEG генерирует ровно одно допустимое дерево для строки. Он определенный, в отличие парсер LL (1). Синтаксический анализатор PEG также напрямую генерирует узлы AST для правила через грамматические действия. За счет этого удается избежать создания промежуточных шагов. Парсер PEG был тщательно протестирован. У него отлажена производительность. Поэтому для большинства инструкций он расходует примерно 10% от объема памяти и вычислительных ресурсов текущего анализатора. Все благодаря тому, что не создается промежуточное синтаксическое дерево. *** Я опустил некоторые детали, чтобы не усложнять прочтение статьи. Для получения более подробной информации вы можете ознакомиться с источником. https://www.python.org/dev/peps/pep-0617 К объекту 1. Первая удаляет префикс – 2. Вторая удаляет суффикс – PEP: 616 Код: Одна из обыденных задач в приложении data science, которое включает в себя манипулирование текстом – удалить префикс/суффикс строк. Добавленные к объекту Как мы уже знаем, первая функция удаляет префикс. Это Строка – это набор символов, и каждый символ имеет индекс в строке. Индексы можно использовать вместе с Если мы говорим о функциях, они проверяют, начинается ли строка с префикса (заканчивается ли она суффиксом), и если да, то возвращают строку без префикса или после суффикса, используя функцию среза Поскольку эти функции являются частью стандартной библиотеки, мы получаем согласованный, менее хрупкий, высокопроизводительный и более наглядный API. *** Для получения более подробной информации вы можете ознакомиться с источником. https://www.python.org/dev/peps/pep-0616 Аннотирование программ стало проще за счет удаления иерархии параллельных типов в Python. Добавлена поддержка универсального синтаксиса во всех стандартных коллекциях, доступных в модуле набора текста. Мы можем использовать встроенные типы коллекций Код стал выглядеть чище, а его понимание и объяснение упростилось. PEP: 585 Несмотря на то, что Python – это язык с динамической типизацией, аннотация типов в программе позволяет проводить самоанализ. Впоследствии аннотацию можно использовать для создания API проверки типов во время выполнения. Как я говорил ранее, в Python 3.9 добавили поддержку универсального синтаксиса во всех стандартных коллекциях, доступных в модуле набора текста. Универсальный тип – это обычно контейнер, к примеру Мы можем использовать встроенные типы коллекций Например, мы могли бы управлять проверкой типов среды выполнения Python, аннотируя код: Ряд функций статической типизации был постепенно построен поверх существующей среды выполнения Python. Некоторые из них были ограничены существующим синтаксисом и поведением во время выполнения. Поэтому в модуле типизации возникла дублированная иерархия коллекций из-за дженериков. Например, мы увидим *** Для получения более подробной информации вы можете ознакомиться с источником. https://www.python.org/dev/peps/pep-0585 Модуль PEP: 615 Часовые пояса IANA часто называют Если мы передадим неверный ключ, возникнет ошибка Библиотека В большинстве случаев нужно просто установить объект и его часовой пояс: UTC, локальный часовой пояс системы, или часовой пояс IANA. Можно создать объект Код: *** Для получения более подробной информации вы можете ознакомиться с источником. https://www.python.org/dev/peps/pep-0615 В Он отменяет все отложенные фьючерсы, которые не были запущены. До версии 3.9 процесс ожидал их завершения перед завершением работы исполнителя. Новый параметр При выполнении Когда не остается незавершенных рабочих элементов, он завершает работу. *** Для получения более подробной информации вы можете ознакомиться с источником. https://bugs.python.org/issue30966 В библиотеку Например: 1. Параметр 2. Добавлены новые сопрограммы: Что касается улучшений библиотеки многопроцессорности, в класс Этот метод точно закрывает очередь. Это гарантирует, что очередь будет закрыта и не останется дольше ожидаемого. Помните, что методы *** Для получения более подробной информации вы можете ознакомиться с источником. https://bugs.python.org/issue30966 Основная проблема импортирования библиотек Python заключалась в несогласованном поведении, когда относительный импорт проходил мимо пакета верхнего уровня. Встроенная функция Теперь это исправили. *** Для получения более подробной информации вы можете ознакомиться с источником. https://bugs.python.org/issue37444 Еще одна функция, добавленная в версии 3.9 – Можно генерировать случайные числа, но что, если нужно генерировать случайные байты? Раньше разработчикам приходилось для этого проявлять изобретательность. Хотя можно использовать К примеру, чтобы гарантировать, что случайные числа генерируются с ожидаемым поведением и процесс воспроизводится, обычно используется модуль В результате был введен метод *** Для получения более подробной информации вы можете ознакомиться с источником. https://bugs.python.org/issue40286 Раньше Этот баг сбивал с толку пользователей и приводил к нестабильному поведению приложений. В Python 3.9 проблема была устранена, и теперь функция замены совместима с Работает она следующим образом: для заданного максимального аргумента вхождения замены, набор символов из строки заменяется новым набором символов: В этом случае возвращается копия строки s со всеми вхождениями старой подстроки, замененной на новую. Если указан необязательный аргумент maxreplace, заменяются первые экземпляры maxreplace. До этого функция replace имела непоследовательное поведение Теперь: В Python 3.9 также был исключен ряд избыточных функций, таких как Если вы хотите узнать больше об этих улучшениях, прочтите официальное руководство здесь. *** Нововведения в популярном языке программирования можно изучить самостоятельно, но придется потратить много времени и сил на поиск и систематизацию информации. Если ваш опыт в профессии еще не так велик, обратите внимание на факультет Python-разработки GeekBrains. Под руководством опытных преподавателей вы получите необходимые знания, а успешно завершившим обучение студентам онлайн-академия поможет с трудоустройством. Интересно, хочу попробовать1. Операторы обновления и слияния словарей
dict
добавлено два оператора: |
и |=
.|
>>> a = {‘farhad’: 1, 'blog’: 2, 'python’: 3} >>> b = {’farhad’: 'malik’, 'topic’: 'python3.9’} >>> a | b {’blog’: 2, 'python’: 3, ’farhad’:’malik’, 'topic’: 'python3.9’} >>> b | a {’farhad’: 1,’blog’: 2, 'python’: 3, 'topic’:’python3.9’ }
|=
>>> a |= b >>> a {’blog’: 2, 'python’: 3,’farhad’:’malik’}
dict
. Более детально
|
и |=
.|
можно рассматривать как оператор +
(сложения) в списках, а |=
– как оператор +=
(расширения).first_dict.update(second_dict)
. Проблема этого метода в том, что он изменит first_dict
на месте. Чтобы этого избежать, нужно объявить временную переменную, сохранить в ней first_dict
, а затем выполнить операцию обновления. Но появляется лишняя строка кода, просто чтобы оператор объединения/обновления работал.{**first_dict, **second_dict}
. Сложность этого метода в том, что его трудно обнаружить и сложнее понять смысл кода. Кроме того, исключаются типы mapping и учитывается только тип dict. Например, если first_dict
– это defaultdict
, а second_dict
– это тип dict
, то программа завершится ошибкой.dict
, которые содержат функцию _init_
.ChainMap
. Она может принять два словаря, как ChainMap (first_dict, second_dict)
, и вернуть объединенный словарь, но об этой библиотеке знают немногие. 2. Новый высокопроизводительный парсер на основе PEG
Более детально
rule: A|B|C
3. Новые строковые функции для удаления префикса и суффикса
str
добавлено две новых функции.str.removeprefix(‘префикс’)
.str.removesuffix(‘суффикс’)
.
'farhad_python'.removeprefix('farhad_') #возвращает python 'farhad_python'.removesuffix('_python') #возвращает farhad
Более детально
str
функции можно использовать для удаления ненужных префиксов и суффиксов из строки.str.removeprefix(‘префикс’)
. Вторая функция удаляет суффикс. Это str.removesuffix(‘суффикс’)
.:
, чтобы вернуть подмножество строки. Эта функция известна как slice
(срез) строки.str [:]
.4. Подсказки типов для встроенных универсальных типов
list
или dict
в качестве универсальных типов вместо использования typing.List
или typing.Dict
в сигнатуре нашей функции.Более детально
list
. Это тип, который можно параметризовать. Параметризованный тип – это пример универсального дженерика с ожидаемыми типами для элементов контейнера типа list [str]
.list
или dict
в качестве универсальных типов вместо использования typing.List
или typing.Dict
.
print_value(input: str): print(input) # Мы получим уведомление, если входные данные не являются строкой
typing.List
, typing.Dictionary
вместе со встроенными list
, dictionary
и т. д. Это позволяет писать код:
def read_blog_tags(tags: list[str]) -> None: for tag in tags: print("Tag Name", tag)
5. Поддержка часового пояса IANA в DateTime
zoneinfo
был создан в качестве поддержки базы данных часовых поясов IANA. Эта поддержка была добавлена в стандартную библиотеку.tz
или zone info. Существует много часовых поясов IANA с разными путями поиска для указания часового пояса IANA объекта datetime
. Например, мы можем передать имя пути поиска объекту datetime
как Continent/City, чтобы установить его tzinfo
.dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))
zoneinfo.ZoneInfoNotFoundError
.Более детально
datetime
используется для создания объекта datetime
и указания его часового пояса, путем установки свойства tzinfo
. Все может обернуться созданием сложных правил часового пояса при использовании базового показателя datetime.tzinfo
.zoneinfo.ZoneInfo(key)
, где ключ имеет строковый тип, указывающий путь поиска файла зоны в базе данных часовых поясов системы. Объект zoneinfo.ZoneInfo(key)
может быть создан и установлен как свойство tzinfo
объекта datetime
.
from zoneinfo import ZoneInfo from datetime import datetime dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("America/Los_Angeles"))
6. Возможность отмены одновременных фьючерсов.
concurrent.futures.Executor.shutdown ()
добавлен новый параметр cancel_futures
.Пояснение
cancel_futures
был добавлен в ThreadPoolExecutor
и ProcessPoolExecutor
. Это работает так: если его значение – True
, все ожидающие фьючерсы отменяются при вызове функции shutdown ()
.shutdown ()
интерпретатор проверяет, не собран ли исполнитель сборщиком мусора. Если он все еще находится в памяти, он получает все ожидающие обработки элементы, а затем отменяет фьючерсы.7. Улучшения AsyncIO и многопроцессорности
asyncio
и многопроцессорную обработку были внесен ряд улучшений.reuse_address
asyncio.loop.create_datagram_endpoint ()
больше не поддерживается из-за серьезных пробелов в безопасности.shutdown_default_executor ()
и asyncio.to_thread (). shutdown_default_executor
назначает завершение работы для исполнителя по умолчанию, который ждет завершения ThreadPoolExecutor. asyncio.to_thread ()
в основном используется для запуска функций, связанных с вводом-выводом, в отдельном потоке, чтобы избежать блокировки цикла событий.multiprocessing.SimpleQueue
был добавлен новый метод close ()
.get ()
, put ()
, empty ()
не должны вызываться после закрытия очереди.8. Постоянные ошибки импорта пакетов
__ import __ ()
вызывает ошибку ValueError
, а importlib .__ import __ ()
вызывает ошибку ImportError
. __Import __ ()
вызывает ImportError
вместо ValueError
.9. Генерация случайных байтов
random.Random.randbytes ()
. Эта функция может использоваться для генерации случайных байтов.os.getrandom ()
, os.urandom ()
или secrets.token_bytes ()
, но нельзя генерировать псевдослучайные паттерны.random.Random
.random.Random.randbytes ()
. Он также может генерировать случайные байты контролируемым способом.10. Исправление функции замены строки
«» .replace («», s, n)
возвращал пустую строку вместо s
для всех ненулевых n
."" .replace ("", s)
.string.replace(s, old, new[, maxreplace])
"".replace("", "blog", 1) Возвращает '' Ожидалось увидеть blog "".replace("", "|", 1) Возвращает '' Ожидалось увидеть | "".replace("", "prefix") Но возвращает 'prefix'
“”.replace(“”,s,n) возвращает s вместо пустой строки для всех ненулевых n
Py_UNICODE_MATCH
.
- 10 views
- 0 Comment