0

Можно ли опустить Optional, если я установил значение по умолчанию на None?

38

Проблема с аннотацией типов в Python: Optional[int] vs int = None

Я столкнулся с проблемой при использовании аннотации типов в Python. У меня есть функция, которая выглядит следующим образом:

def foo(bar: int = None):
    pass

Когда я проверяю тип/аннотацию параметра bar, PyCharm сообщает мне, что он имеет тип Optional[int]. Это вызывает у меня некоторые сомнения.

Мне кажется, что запись bar: int = None выглядит гораздо чище по сравнению с bar: Optional[int] = None, особенно когда у вас есть много параметров (больше 10). Поэтому у меня возникает вопрос: могу ли я просто опустить Optional? Будут ли такие инструменты, как mypy или другие линтеры, отмечать это как ошибку?

На первую очередь, похоже, что сама Python не одобряет отсутствие Optional, так как я провел следующий эксперимент:

from typing import Optional
from inspect import signature

def foo(a: int = None): pass
def bar(a: Optional[int] = None): pass

signature(foo).parameters['a'].annotation  # возвращает int
signature(bar).parameters['a'].annotation  # возвращает typing.Union[int, NoneType]

Здесь можно видеть, что аннотация параметра функции foo возвращает просто int, а для bar возвращается тип Union[int, NoneType].

Таким образом, какова правильная практика: имеет ли смысл опускать Optional в аннотациях, и будет ли это вызвано как ошибка линтерами?

0 ответ(ов)

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь