在python中使用函数中的varargs传递默认参数

eag*_*arn 1 python function variadic-functions default-parameters

当我尝试以下操作时,我自己就会出错function definition.

>>> def mymap(*seq,pad=None):
  File "<stdin>", line 1
    def mymap(*seq,pad=None):
   SyntaxError: invalid syntax 
Run Code Online (Sandbox Code Playgroud)

我试图给参数的默认值pad.

但后来,我尝试了这个并且它有效(出于错误的原因):

>>> def mymap(pad=None,*seq):
...    print seq
>>> mymap([1,2,3],[4,5,6])
([4, 5, 6],)
[(4,)]
>>> 
Run Code Online (Sandbox Code Playgroud)

这不是印刷tuple的seq应该是([1,2,3],[4,5,6]).

aba*_*ert 5

你真正想要的是pad成为一个只有关键字的参数.

3.0中的一个主要变化是设计函数参数和参数,除其他外,提供您正在寻找的功能.事实上,您的第一个版本的工作方式正如您所希望的那样.但是如果你想坚持2.x,你就不会得到3.x中的任何新功能.

所以,你别无选择,只能伪造它:

def mymap(*seq, **kwargs):
    pad = kwargs.pop('pad', None)
    if kwargs:
        raise TypeError("mymap() got an unexpected keyword argument '{}'".format(kwargs.keys()[0]))
    print seq
Run Code Online (Sandbox Code Playgroud)

这几乎与等效的Python 3代码完全相同.当然它更复杂,更不清晰,更慢,并且内省不透明...所有这些正是为什么在3.0中添加仅关键字参数的原因.但是如果你需要它,并且你不能使用Python 3.x,这就是你必须要做的.(只是很高兴你没有尝试编写C-API函数.)


你似乎混淆了两个完全独立的东西:一个具有默认值的参数(我假设你的意思是"默认参数",这并不意味着什么),并且只是关键字.

在第二个版本中,您已经有一个带默认值的参数.您可以轻松地看到:调用mymap(),并且成功,pad获取其默认值None(并且seq为空).

但是你希望它也是一个只有关键字的参数,所以它不会窃取第一个位置参数.这是你在2.x中无法做到的部分.


如果您想了解更多信息,PEP 3012将解释仅关键字功能,参数和参数会尝试收集所有相关文档链接,并总结所有内容如何组合在一起.