gpt4 book ai didi

python - 在python函数中传递带有varargs的默认参数

转载 作者:行者123 更新时间:2023-12-02 15:34:09 26 4
gpt4 key购买 nike

当我尝试以下操作时,函数定义 本身出现错误。

>>> 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,)]
>>>

它不打印 seqtuple 应该是 ([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

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


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

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

但是您希望它是一个仅限关键字的参数,这样它就不会窃取第一个位置参数。这就是您在 2.x 中不能做的部分。


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

关于python - 在python函数中传递带有varargs的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com