当我尝试以下操作时,我在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
。
答案 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
的默认值为None
(seq
为空)。
但是你希望它也是一个只有关键字的参数,所以它不会窃取第一个位置参数。这是你在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])