def func(a, b = 100):
return a + b
func(a)
func(a,b = 100)
有没有办法告诉func何时被调用,b值100是从默认值还是关键字参数中获取的?
答案 0 :(得分:4)
不,不是因为你已经编写了代码。但是,您可以这样做:
def func(a, b=None):
if b is None:
b = 100
return a + b
答案 1 :(得分:4)
匿名对象是覆盖所有可能情况的方法。
def foo(a, b=object()):
if b is foo.func_defaults[0]:
# no value was passed
# do whatever
答案 2 :(得分:2)
要知道这不是func的业务。但您可以默认为None
。
def func(a, b=None):
if b is None:
# b = default b
b = 100
return a + b
答案 3 :(得分:1)
您可以使用对象作为默认值,例如
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
答案 4 :(得分:0)
如果您的目的是检查b
是否与默认值完全匹配,那么请不要使用默认值!如果您绝对必须离开b
可选,请传递一个特殊值(可能是-1
)来表示异常情况,并务必在__doc__
中注明。只要确保在日常使用中无法达到特殊价值,并且包含该逻辑的异常不会修改代码的敏感区域。
答案 5 :(得分:0)
其他建议的替代方法是使用kwargs
参数,然后执行以下操作:
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)
输出:
b was not passed in
150
b was passed in
150
因为kwargs
是包含所有非可选参数的字典,所以您可以检查此字典以确定未传递的内容。
如果需要,您可以更有效地查找b
,而不是查找kwargs
两次。