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]).
你真正想要的是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将解释仅关键字功能,参数和参数会尝试收集所有相关文档链接,并总结所有内容如何组合在一起.
| 归档时间: |
|
| 查看次数: |
1596 次 |
| 最近记录: |