2016-08-02 74 views
42

如果我有这样的功能:添加默认参数的值与类型提示在Python

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 
+1

最后一个功能是正确的方法。 “scala”语言也是这样。 –

+4

你有一个可变的默认类型 - 这将导致问题 –

+0

看到我的更新答案,@josh –

回答

52

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

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

print(foo.__annotations__) 

这个输出

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

这是真的,就是它的不PEP 484上市,但类型提示有功能注解,这是在PEP文档的应用3107 The syntax section明确指出,关键字参数作品以这种方式使用功能注释。

我强烈建议不要使用可变关键字参数。更多信息here

+1

请参阅http://legacy.python.org/dev/peps/pep-3107/#syntax。类型提示只是功能注释的应用。 – chepner

+0

@chepner true。不知道PEP 3107有关于关键字参数的内容。 –

+1

哇,我不知道Python中的可变默认参数...特别是来自JavaScript/Ruby,其默认参数的工作方式不同。不会重复什么已经说过的关于它的广告恶心,我只是很高兴我发现这件事之前,它咬我。谢谢! – josh