有没有办法告诉python函数收到默认值或关键字参数?
有没有办法判断何时调用func,b值100取自默认参数或关键字参数?没有,不是您编写的代码。但是,您可以执行以下操作:有没有办法告诉python函数收到默认值或关键字参数?,python,function,parameter-passing,keyword,Python,Function,Parameter Passing,Keyword,有没有办法判断何时调用func,b值100取自默认参数或关键字参数?没有,不是您编写的代码。但是,您可以执行以下操作: def func(a, b = 100): return a + b func(a) func(a,b = 100) 您可以使用对象作为默认值,例如 def func(a, b=None): if b is None: b = 100 return a + b 知道真的不是func的事。但您可以将默认值改为None dummy = ob
def func(a, b = 100):
return a + b
func(a)
func(a,b = 100)
您可以使用对象作为默认值,例如
def func(a, b=None):
if b is None:
b = 100
return a + b
知道真的不是func的事。但您可以将默认值改为
None
dummy = object()
def func(a, b=dummy):
used_default = b is dummy
if used_default:
b = 100
print used_default
func(0) # prints True
func(0, None) # prints False
func(0, object()) # prints False
匿名对象是覆盖所有可能情况的方法
def func(a, b=None):
if b is None:
# b = default b
b = 100
return a + b
如果您的目的是检查
b
是否与默认值完全匹配,则不要使用默认值!如果您必须将b
保留为可选,请传递一个特殊值(可能是-1
)以表示异常情况,并确保在\uuuuuu文档中注意这一点。只需确保您在日常使用中无法达到异常值,并且为包含该逻辑而编写的异常不会修改代码的敏感区域。其他建议的替代方法是使用kwargs
参数,然后执行以下操作:
def foo(a, b=object()):
if b is foo.func_defaults[0]:
# no value was passed
# do whatever
输出:
def func(a, **kwargs):
if 'b' in kwargs:
print 'b was passed in'
b = kwargs['b']
else:
print 'b was not passed in'
b = 100
return a + b
a = 50
func(a)
func(a, b = 100)
由于kwargs
是一个包含所有非可选参数的字典,因此您可以检查此字典以确定哪些参数已传递/未传递
如果需要,您可以使b
的查找更高效,而不是两次查找kwargs
如果没有通过,你怎么知道?通过None
与不通过任何东西是一样的。不,你不能区分这两种情况是描述发生了什么的正确方式。我是说,如果你需要区分这一点,你的解决方案就不起作用了。调用func(a_var)
相当于调用func(a_var,None)
。如果你真的需要知道,那么你需要将默认值设置为不可能传入的值,通过以调用方无权访问默认值的方式打包函数。好的,使用不可变对象。这没关系,因为它是一个你不会做任何事情的虚拟物体。哦,我知道你在那里做了什么。您正在测试id
是否匹配。我给你留下的链接更多的是关于传递空列表,以便稍后在函数中使用。对于我在某处读到的A来说,许多答案看起来非常熟悉…这可能是一个。聪明的,但如果我在真实代码中看到这一点,它肯定会让我挠头。@AdamParkin是的,在90%或更多的情况下,无
解决方案将是正确的“更好“,只是因为它更容易理解。如果我在审查我在现实世界中发布的代码,我会要求使用None
的方法,或者说明为什么需要这种特定方法。但它仍然是解决所有问题的方法,尽管如此,如果OP需要解决所有问题的方法,它可能是解决方案。
b was not passed in
150
b was passed in
150