【发布时间】:2015-07-16 01:05:46
【问题描述】:
以下代码的目的是将传递给main 的关键字参数传递给其他调用的函数。但是,如果没有为 key1 参数赋予 main 值,则 f2 中的 key1 的默认值将被 main 传递的 None 的值覆盖。
def main(x, key1=None, key2=None):
f1(x, key1=key1)
f2(x, key1=key1, key2=key2)
def f1(x, key1=None): # note key2 is absent
print(x, key1)
def f2(x, key1=42, key2=None):
print(x, key1, key2)
main(1)
输出:
(1, None)
(1, None, None)
有没有一种简单的方法可以仅更改main 的定义(可能包括参数),以便调用函数的输出如下所示?
(1, None)
(1, 42, None)
显然,有一些荒谬的方法可以仅更改 main 以创建该输出,但是将逻辑插入 main 以传递特定函数的缺失参数的默认值或更改main 传递的关键字取决于其中哪个是None。所以我不是在寻找这样的解决方案。
解决这个问题的常用方法是在所有函数中使用**kwargs。或者,您可以更改f2 的定义:
def f2(x, key1=None, key2=None):
if key1 is None:
key1 = 42
print(x, key1, key2)
但我想知道是否还有其他选择。
【问题讨论】:
-
在您设想的方案中,如果用户调用
main(1, None)(为key1显式传递None)会发生什么? -
我不明白您为什么将默认值放在 f1 和 f2 中。由于 main 为它们提供了默认值,这些变量将始终具有值。
-
@SBHayes:因为这些函数可能在其他地方被调用,而不仅仅是来自
main。 -
@BrenBarn:好问题。取决于它的实现方式,那里可能存在一些歧义。老实说,无论在这种情况下的行为如何,拥有一些可以工作的东西会很好。但我不希望有人在
main中将值显式设置为None,因为函数本身就是一个包装器。
标签: python