Добавление значения параметра по умолчанию с подсказкой типа в Python
Если у меня есть такая функция:
def foo(name, opts={}):
pass
И я хочу добавить подсказки типа к параметрам, как это сделать? То, как я предполагал, дает мне синтаксическую ошибку:
def foo(name: str, opts={}: dict) -> str:
pass
Следующее не выдает синтаксическую ошибку, но это не похоже на интуитивный способ обработки этого случая:
def foo(name: str, opts: dict={}) -> str:
pass
Я не могу найти что-либо в typing
документации или в поиске Google.
Изменить: я не знал, как аргументы по умолчанию работали в Python, но ради этого вопроса я продолжу приведенные выше примеры. В общем, гораздо лучше сделать следующее:
def foo(name: str, opts: dict=None) -> str:
if not opts:
opts={}
pass
Ответы
Ответ 1
Второй способ правильный.
def foo(opts: dict = {}):
pass
print(foo.__annotations__)
это выводит
{'opts': <class 'dict'>}
Верно, что он не указан в PEP 484, но тип подсказок - это приложение аннотаций функций, которые задокументированы в PEP 3107. Раздел синтаксиса дает понять, что аргументы ключевого слова работают с аннотациями функций таким образом.
Я настоятельно рекомендую использовать mutable аргументы ключевого слова. Подробнее здесь.
Ответ 2
Я недавно видел эту однострочную:
def foo(name: str, opts: dict=None) -> str:
opts = {} if not opts else opts
pass
Ответ 3
Если вы используете печатание (введено в Python 3.5), вы можете использовать typing.Optional
, где Optional[X]
эквивалентен Union[X, None]
. Он используется, чтобы сигнализировать, что явное значение None
разрешено. Из набора. Дополнительно:
def foo(arg: Optional[int] = None) -> None:
...