python 如何在使用类型提示时向函数添加默认参数?

ujv3wf0j  于 2022-12-10  发布在  Python
关注(0)|答案(3)|浏览(105)

如果我有这样一个函数:

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

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

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

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

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

我在typing documentation或谷歌搜索中找不到任何东西。
编辑:我不知道默认参数在Python中是如何工作的,但是为了回答这个问题,我将保留上面的例子。一般来说,做下面的事情要好得多:

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

0lvr5msh1#

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

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

print(foo.__annotations__)

该输出

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

PEP 484中确实没有列出类型提示,但类型提示是函数注解的一种应用,PEP 3107中对此进行了说明。语法部分清楚地说明了关键字参数以这种方式与函数注解一起工作。
我强烈建议不要使用可变的关键字参数。更多信息在这里。

hc8w905p

hc8w905p2#

如果你正在使用typing(Python 3.5中引入的),你可以使用typing.Optional,这里Optional[X]等价于Union[X, None]。它被用来表示None的显式值是允许的。通过键入。可选:

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

bgtovc5b3#

我最近看到了这样一句俏皮话:

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

相关问题