如果我有这样的功能:
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
scala
语言也是如此。
你的第二种方法是正确的。
def foo(opts: dict = {}):
pass
print(foo.__annotations__)
这输出
{'opts': <class 'dict'>}
确实,它没有在 PEP 484 中列出,但类型提示是函数注释的应用,在 PEP 3107 中有记录。The syntax section 清楚地表明关键字参数以这种方式与函数注释一起使用。
我强烈建议不要使用可变关键字参数。更多信息here。
如果您使用 typing(在 Python 3.5 中引入),则可以使用 typing.Optional
,其中 Optional[X]
等同于 Union[X, None]
。它用于表示允许 None
的显式值。从 typing.Optional:
def foo(arg: Optional[int] = None) -> None:
...
Optional[int] = None
中的 =
周围不应该没有空格,就像它是非类型提示关键字参数的约定一样?
我最近看到了这个单行:
def foo(name: str, opts: dict=None) -> str:
opts = {} if not opts else opts
pass
None
设为默认值,然后在方法内部进行检查,通过在每次调用该方法时分配一个新的 dict 来避免此问题。
opts = opts or {}
怎么样
{}
时它将失败。坚持使用传统的双线可能更安全if opts is None: opts = {}
。如果您需要单线,我更喜欢 opts = {} if opts is None else opts
。
不定期副业成功案例分享
dict = {}
中的=
周围不应该没有空格,就像它是非类型提示关键字参数的约定一样?