Могу ли я опустить опцию «Необязательно», если я установил значение по умолчанию «Нет»?

Например:

def foo(bar: int = None):
    pass

Когда я проверяю тип / аннотацию bar, pycharm сообщает мне, что это Optional[int].

bar: int = None выглядит намного чище, чем bar: Optional[int] = None, особенно когда у вас более 10 параметров.

Могу я просто опустить Optional? Будут ли такие инструменты, как mypy или другие линтеры, выделять этот случай как ошибку en?

Похоже, сама идея python не нравится:

In [1]: from typing import Optional
In [2]: from inspect import signature

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

In [5]: signature(foo).parameters['a'].annotation
Out[5]: int

In [6]: signature(bar).parameters['a'].annotation
Out[6]: typing.Union[int, NoneType]

person aiven    schedule 04.07.2020    source источник
comment
comment
Кстати, если ваша функция принимает более 10 параметров, возможно, пора подумать о рефакторинге.   -  person Emerson Harkin    schedule 14.07.2020


Ответы (2)


Нет. Пропуск Optional был ранее разрешен, но с тех пор был удален.

предыдущая версия этого PEP разрешала проверку типов. принять необязательный тип, когда значение по умолчанию - Нет [...]

Это больше не рекомендуется. Средствам проверки типов следует перейти к тому, чтобы требовать, чтобы необязательный тип был явным.

Некоторые инструменты могут по-прежнему обеспечивать старое поведение для устаревшей поддержки. Даже если это так, не рассчитывайте на его поддержку в будущем.


В частности, mypy по-прежнему поддерживает неявный Optional по умолчанию, но явно отмечает, что это может измениться в будущем:

Необязательные типы и тип None (mypy v0.782)

[...] Вы можете использовать параметр командной строки --no-implicit-optional, чтобы перестать рассматривать аргументы со значением по умолчанию None как имеющие неявный тип Optional [...]. Возможно, в будущем это станет поведением по умолчанию.

Отказ от этого поведения отслеживается в mypy / # 9091.

person MisterMiyagi    schedule 04.07.2020
comment
но почему: расскажи мне больше - person Tjorriemorrie; 13.07.2020