Что предлагают разработчики в PEP

автор рубрика
Что предлагают разработчики в PEP

Прежде чем в Python появятся новые фичи, изменения или улучшения, они должны быть внесены в Python Enhancement Proposal или просто PEP. Заглядывая в PEP’ы можно встретить те предложения, которые затем появятся в новом релизе языка. В этой статье рассматриваются те предложения, которые могут появиться в Python в ближайшее время.

Изменения в синтаксисе

PEP 671 предлагает добавить позднее связывание в параметрах в виде функций по умолчанию. Что это значит?

Функции в Python могут принимать другие функции в качестве параметров. Однако нет способа дать им функцию по умолчанию, поэтому приходится постоянно передавать ее явно. Иногда им дается значение None или глобальная константа, но они имеют ряд недостатков, включая невозможность открытия документации через help(function). Поэтому в этом PEP предлагается использовать специальную нотацию => (param=>func()) для обозначения функциональных параметров по умолчанию:

# Применяемый на данный момент способ:
_SENTINEL = object()

def func(param=_SENTINEL):
    if param is _SENTINEL:
        # `default_param` содержит функцию по умолчанию
        param = default_param

# Новый способ:
def func(param=>default_param):
    ...

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

PEP 654 предлагает добавить except* для обозначения группы исключений. Причина возникновения данного предложения заключается в том, что интерпретатор Python может работать с одним исключением за раз. Но иногда требуется проверить несколько несвязных исключений. Одним из таких примеров является одновременные ошибки, возникающие из asyncio.

try:
    some_file_operation()
except* OSError as eg:
    for e in eg.exceptions:
        print(type(e).__name__)

# FileNotFoundError
# FileExistsError
# IsADirectoryError
# PermissionError
# ...

Аннотации типов

Не обошлось без нововедений в аннотацию типов (каждый релиз Python не обходиться без новшеств в аннотациях).

Подготовка данных для Data Mining на Python

Код курса
DPREP
Ближайшая дата курса
14 июня, 2022
Длительность обучения
32 ак.часов
Стоимость обучения
60 000 руб.

PEP 673 предлагает простой и интуитивно понятный интерфейс для аннотации методов, которые возвращают экземпляр их класса. Объясним это на примере. Допустим, есть класс Person с методом set_name, который возвращает экземпляр данного класса. Если вы создадите подкласс Employee, то метод set_name должен вернуть экземпляр Employee, а не Person. Но так не работает проверка типов: в Python 3.10 вернется именно базовый класс. Поэтому PEP 673 корректирует данное поведение с помощью типа Self:

class Person:
    def set_name(self, name: str) -> Self:
        self.name = name
        return self

Данное предложение уже будет принято в Python 3.11.

PEP 675 предлагает ввести произвольный строковый литерал LiteralString. На данный момент в Python для произвольного строкового литерала используется Literal (см. PEP 586). Новый строковый литерал поможет писать более безопасные SQL-запросы, так как избавит от пользовательских строк, в которые можно добавить все что угодно.

Отладка

PEP 669 предлагает такой способ мониторинга за CPython, при котором не падает производительность программы при отладке или профилировании. На многих разработчиков это не окажет никакого влияния, однако данное предложения может быть полезным в случаях:

  • отладки, которая может быть задействована только в production;
  • отладки ситуации гонок, при котором время может повлиять на то, появится ли ошибка или нет;
  • отладки при оценке производительности.

PEP 678 предлагает добавить атрибут __note__ в класс BaseException. Этот атрибут будет содержать дополнительную отладочную информацию, которая можно затем просмотреть в обратной трассировке.

try:
    raise TypeError('Some error')
except Exception as e:
    e.__note__ = 'Extra information'
    raise

# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# TypeError: Some error
# Extra information

PEP 657 предлагает добавить дополнительную информацию в каждую инструкцию байт-кода. Опять же делается это для более детального просмотра обратной трассировки. Также предлагается добавить API, который позволит другим инструментам (анализаторам, отладчикам, профилировщикам) получить информацию о коде. Занимающимся информационной безопасностью, пентестерам данный PEP будет по душе.

Что еще

PEP 680 предлагает добавить модуль в стандартную библиотеку для парсинга формата TOML.

TOML используется во многих инструментах Python, включая системы сборки. Следовательно, для них это тоже проблема: парсить самому или использовать стороннюю библиотеку (а это значит увеличение количества зависимостей). Тот же flake8 не анализирует TOML из-за нехватки поддержки со стороны стандартной библиотеки. В качестве модуля предлагается использовать tomli.

Правда, возникает очевидный вопрос: “Будет ли когда-нибудь поддержка YAML?”

PEP 661 вводит новый способ задания значений, или sentinel values, которые бы сигнализировали о чем-то, например, об ошибке. Обычно это делается с помощью _sentinel = object(), но при таком способе затрудняется отладка. Предлагается внести это в стандартную библиотеку:

# Старый способ:
_sentinel = object()

# Новый способ:
from sentinels import sentinel
some_name = sentinel("some_name")

 

Также обратите внимание наши курсы по Python для повышения квалификации в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Комментировать