Скоро, 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-специалистов в Москве.
Ошибка в примере с s.removesuffix
Чтобы код заработал, нужно написать» s.removesuffix(‘ school!’)» а не «s.removesuffix(‘school’)»
Да, действительно, не хватало восклицательного знака