【发布时间】:2018-02-19 00:23:07
【问题描述】:
例如,假设我定义了一个函数
def myfunc(a=1, *args):
print(a)
# *args have some other functionality, for example passed to a class instance, or whatever
问题是:在调用myfunc 时,我无法先传递*args 的预期位置参数,然后传递关键字参数a。例如,如果预期的*args 只包含一个数字,我不能这样做
myfunc(3, a=4)
这会引发一个错误,说明收到了多个任务。我显然不能myfunc(a=4, b=5, 3)。我只能这样做
myfunc(4, 3)
所以现在看来,使用*args,关键字参数a 真的变成了位置?
这里的例子是一个函数,但它也适用于类。假设一个带有__init__(a=3, *args) 的子类想要一些关键字参数a 和一些其他99 个必需参数传递给super。我不想在子类中重复 99 个参数的定义,而是做 *args 并将其传递给 super。但是现在关键字参数a 变成了位置。
这个类和子类的例子是我编码中的真正问题。我想要一个带有可选关键字参数a 的子类,然后是它的父类的99 个必需参数。我没有看到解决这个问题的好方法。
我不是第一个遇到这个问题的人,但我找不到任何答案。
【问题讨论】:
-
我认为这样做的方法是摆脱您的
a并改用*kwargs。然后,如果您仍然想要a的默认值,则必须在您的函数/类中实现它。准确地说,告诉 python*args有点像是在说“任何其他会出现的论点”。因此,在您引发错误的示例中,Python 将第一个参数映射到它知道的命名参数 (a),因此当您想显式设置a的值时,Python 会因为它已经有一个值而感到困惑为它。 -
感谢您的评论。你是说
**kwargs?是的,我理解发生这种情况的原因,我很惊讶*args关键字参数变成了位置。我在实际编码中真正遇到的更像是类和子类示例,我看不出有什么好的方法。 -
@Alex。我可能在这里遗漏了一些东西 - 但为什么不使用关键字参数在
*args之后定义函数? -
我使用的是 Python 2.7?也许在 Python 3 中可以做到这一点?
-
@Alex。切换到 Python 3 的另一个很好的理由:P
标签: python python-2.7 function arguments keyword