在Python中使用类型提示添加默认参数值

时间:2016-08-02 18:01:37

标签: python python-3.x type-hinting

如果我有这样的功能:

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

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

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

以下内容并未引发语法错误,但它似乎不是处理此案例的直观方式:

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

我无法在typing documentation或Google搜索中找到任何内容。

编辑:我不知道默认参数在Python中是如何工作的,但是为了这个问题,我将保留上面的例子。一般来说,执行以下操作要好得多:

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

3 个答案:

答案 0 :(得分:138)

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

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

print(foo.__annotations__)

此输出

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

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

我强烈反对使用可变关键字参数。更多信息here

答案 1 :(得分:2)

我最近看到了这种单线纸:

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

答案 2 :(得分:2)

如果您使用的是typing(在Python 3.5中引入),则可以使用typing.Optional,其中Optional[X]等效于Union[X, None]。它用于表示允许None的显式值。来自typing.Optional

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