jos*_*osh 169 python type-hinting python-3.x
如果我有这样的功能:
def foo(name, opts={}):
pass
Run Code Online (Sandbox Code Playgroud)
我想在参数中添加类型提示,我该怎么做?我假设的方式给了我一个语法错误:
def foo(name: str, opts={}: dict) -> str:
pass
Run Code Online (Sandbox Code Playgroud)
以下不会抛出语法错误,但它似乎不是处理这种情况的直观方式:
def foo(name: str, opts: dict={}) -> str:
pass
Run Code Online (Sandbox Code Playgroud)
我在typing文档或Google搜索中找不到任何内容.
编辑:我不知道默认参数在Python中如何工作,但为了这个问题,我将保留上面的例子.一般来说,做以下事情要好得多:
def foo(name: str, opts: dict=None) -> str:
if not opts:
opts={}
pass
Run Code Online (Sandbox Code Playgroud)
noɥ*_*ɐɹƆ 198
你的第二种方式是正确的.
def foo(opts: dict = {}):
pass
print(foo.__annotations__)
Run Code Online (Sandbox Code Playgroud)
这个输出
{'opts': <class 'dict'>}
Run Code Online (Sandbox Code Playgroud)
确实,它没有在PEP 484中列出,但类型提示是函数注释的应用程序,在PEP 3107中有记录.语法部分清楚地表明关键字参数以这种方式与函数注释一起工作.
我强烈建议不要使用可变关键字参数.更多信息在这里.
小智 17
我最近看到了这个单行:
def foo(name: str, opts: dict=None) -> str:
opts = {} if not opts else opts
pass
Run Code Online (Sandbox Code Playgroud)
If you're using typing (introduced in Python 3.5) you can use typing.Optional, where Optional[X] is equivalent to Union[X, None]. It is used to signal that the explicit value of None is allowed . From typing.Optional:
def foo(arg: Optional[int] = None) -> None:
...
Run Code Online (Sandbox Code Playgroud)