Что ждет нас в Python 3.9

автор рубрика
Что ждет нас в Python 3.9

Скоро, 10 октября 2020 года, выйдет из стадии бета Python версии 3.9. Читайте у нас: новые улучшения, которые сделают Python быстрее, новый синтаксис объединения словарей, а также новые модули и методы removeprefix и removesuffix.

Python становится быстрее

Python 3.9 станет больше использовать протокол Vectorcall [1], а это значит, что многие встроенные функции будут работать быстрее за счет минимизации и устранения временных объектов. Встроенные структуры данных: range, tuple, set, frozenset, list, dict — также станут работать быстрее.
Кроме того, парсер LL(1) будет заменен на PEG. Как утверждают разработчики, повышение производительности от смены парсера ждать не придётся, но зато добавлять новые возможности в язык будет гораздо проще.

Объединение словарей

Объединить два словаря (dict) можно двумя способами: вызвать метод d1.update(d2) или использовать конструкцию {**d1,**d2}. Первый способ является in-place, т.е. сам словарь изменяется. Но в некоторых задачах не требуются изменять исходные словари, а нужно создать новый, который объединяет старые, поэтому применяется второй способ. Оба способа в раннем Python выглядят вот так:

>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> {**e, **d}
{'cheese': 3, 'aardvark': 'Ethel', 'spam': 1, 'eggs': 2}
>>> e.update(d)
>>> e
{'cheese': 3, 'aardvark': 'Ethel', 'spam': 1, 'eggs': 2}

Конструкция {**d1,**d2} — не очень ясна и понятна, не каждый догадается, почему она имеет такой вид. Поэтому в Python 3.9 будет применяться тот же оператор, который используется для объединения множеств (set), — прямая черта:

>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}

А чтобы объединить словари in-place, нужно будет добавить к прямой черте знак равно:

>>> d |= e
>>> d
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}

В версии in-place можно также добавлять структуры данных, которые могут итерироваться в виде ключ-значение (key-value). Например:

>>> d |= [('spam', 999)]
>>> d
{'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel', 'spam': 999}

Встроенные подсказки типов (Type Hinting)

Python — язык с динамической типизацией, поэтому типы данных (int, float, list) определяются только в момент использования. Отсюда могут возникнуть проблемы с надёжностью кода, когда, например, в список с числами попадает строковые значение. Начиная с версии 3.5 были придуманы подсказки типов (type hintings). Они не делают язык статически типизированным, но делают код более явным, а такой инструмент, как MyPy, помогают тестировать код, который содержит подсказки типов [2].
Например, чтобы явно прописать, что структура данных должна состоять только из чисел, то они импортируются из модуля typing:

>>> from typing import List, Tuple, Dict
>>> List[str]
typing.List[str]
>>> Tuple[int, ...]
typing.Tuple[int, ...]
>>> Dict[str, int]
typing.Dict[str, int]

В Python 3.9 ничего импортировать не нужно, достаточно применять встроенные структуры данных или структуры данных из модуля collections:

>>> list[str]
<class 'list'>
>>> tuple[int, ...]
<class 'tuple'>

В функциях или классах они могут выглядеть следующим образом:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

Обращение к декораторам без ограничений

В Python 3.9. декораторы можно хранить в словаре, списке или другом контейнере.  Обращение осуществляется согласно синтаксису контейнера:

decorators = {'dec': dec}

@decorators['dec']
def foo(x):
    print('Hello')

В ранних версиях Python на такую конструкцию поднимется ошибка SyntaxError.

Часовые пояса в zoneinfo

В Python 3.9 появился новый модуль для работы с часовыми поясами — zoneinfo. Если datetime.tzinfo использовал системное время, то zoneinfo располагает базой данных часовых поясов, поэтому можно считать время относительно часового пояса какого-либо города:

>>> from zoneinfo import ZoneInfo
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))

Новые методы removeprefix и removesuffix у str

Для некоторых задач требуется получить расширение файла или нужно удалить первые и последние символы слова. В ранних версиях необходимо разрезать строку с помощью индексации (slicing). А теперь в Python 3.9 методы removeprefix и removesuffix удалят символы с начала и конца, соответственно:

>>> s = 'Hello World from python school!'
>>> s.removeprefix('Hello World')
>>> from python school!
>>> s.removesuffix('school')
>>> Hello World from Python

 

 

О том, как применять Python 3.9 и его новые особенности на реальных проектах Data Science, вы узнаете на наших курсах по Python в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.

Источники
  1. https://www.python.org/dev/peps/pep-0590/
  2. http://mypy-lang.org/
Комментировать

Ваш адрес email не будет опубликован. Обязательные поля помечены *