2

当我尝试以下操作时,我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的。seq([1,2,3],[4,5,6])

4

2 回答 2

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

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


您似乎混淆了两个完全独立的东西:一个具有默认值的参数(我认为这是您所说的“默认参数”一词的意思,实际上并没有任何意义),并且是仅关键字。

在您的第二个版本中,您已经有了一个具有默认值的参数。你可以很容易地看到: call mymap(),它成功了,pad它的默认值是None(并且seq是空的)。

但是您希望它也是一个仅限关键字的参数,因此它不会窃取第一个位置参数。这就是你在 2.x 中无法做到的部分。


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

于 2014-01-06T23:34:24.987 回答
1

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

mymap([1,2,3], [4,5,6])<< 在此示例中,从您的代码中,[1,2,3]传入的是 pad,[4,5,6]传入的是 seq。这就是为什么打印 seq 会导致[4,5,6]

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

例如:

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

印刷:

([1,2,3], [4,5,6])
于 2014-01-06T23:28:07.603 回答