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

时间:2014-01-06 23:17:13

标签: 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 

我正在尝试为参数pad提供默认值。

然而,我试过这个并且它有效(出于错误的原因):

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

不会打印tuple的{​​{1}} seq

2 个答案:

答案 0 :(得分: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

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


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

在第二个版本中,您已经有一个带默认值的参数。您可以轻松地看到这一点:致电mymap(),然后成功,pad的默认值为Noneseq为空)。

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


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

答案 1 :(得分:0)

看起来您正在输入args [1,2,3][4,5,6]作为两个单独的参数。他们不是一个元组。

mymap([1,2,3], [4,5,6])&lt;&lt;在此示例中,从您的代码中传递了[1,2,3] for pad,而[4,5,6]正在传入seq。这就是打印seq导致[4,5,6]

的原因

此外,像pad这样的命名参数必须在*args**kwargs之前。

例如:

mymap(None, [1,2,3],[4,5,6]) #passing None for pad

打印:

([1,2,3], [4,5,6])