Подтвердить что ты не робот

Добавление значения параметра по умолчанию с подсказкой типа в 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
4b9b3361

Ответ 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:
    ...