474

如果我有这样的功能:

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
4

3 回答 3

530

你的第二种方法是正确的。

def foo(opts: dict = {}):
    pass

print(foo.__annotations__)

这输出

{'opts': <class 'dict'>}

确实,它没有在PEP 484中列出,但是类型提示是函数注释的应用,在 PEP 3107 中有记录。语法部分清楚地表明关键字参数以这种方式与函数注释一起使用。

我强烈建议不要使用可变关键字参数。更多信息在这里

于 2016-08-02T18:18:22.327 回答
68

如果您正在使用打字(Python 3.5 中引入),您可以使用typing.Optional,其中Optional[X]等效于Union[X, None]. 它用于表示None允许的显式值。从打字。可选:

def foo(arg: Optional[int] = None) -> None:
    ...
于 2019-06-19T14:41:58.330 回答
21

我最近看到了这个单行:

def foo(name: str, opts: dict=None) -> str:
    opts = {} if not opts else opts
    pass
于 2019-06-05T20:43:42.030 回答