如果我有一个这样的函数

def foo(name, opts={}):
  pass

我想给参数添加类型提示,怎么做呢?我假设的方式给了我一个语法错误:

def foo(name: str, opts={}: dict) -> str:
  pass

下面的语句不会抛出语法错误,但它似乎不是处理这种情况的直观方式:

def foo(name: str, opts: dict={}) -> str:
  pass

我在打字文档和谷歌搜索中都找不到任何东西。

编辑:我不知道Python中的默认参数是如何工作的,但为了解决这个问题,我将保留上面的示例。一般来说,最好做以下几点:

def foo(name: str, opts: dict=None) -> str:
  if not opts:
    opts={}
  pass

当前回答

第二种方法是正确的。

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

print(foo.__annotations__)

这个输出

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

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

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

其他回答

第二种方法是正确的。

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

print(foo.__annotations__)

这个输出

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

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

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

我最近看到这样一句话:

def foo(name: str, opts: dict=None) -> str:
    if opts is None:
        opts = {}
    pass  # ...

如果您正在使用类型(在Python 3.5中引入),则可以使用类型。可选,其中Optional[X]相当于Union[X, None]。它用来表示允许显式值为None。从打字。可选:

def foo(arg: Optional[int] = None) -> None:
    ...