警告
您要求“在 Python 中将参数指定为 None 时,让函数使用其默认值作为参数的好方法?”
我会争辩说没有好的方法,因为这不是一件好事。这是一件有风险的事情——它可以掩盖令人讨厌的错误情况,在这些情况下,您可能合理地想要检测None
在您期望值的地方传递的事实。在广泛使用这种技术的地方进行调试可能会很糟糕。 使用时要格外小心。
可能的方法
我猜你想要一个通用的解决方案,它可以用于比你作为示例提供的功能更多的功能。在示例情况下 - 您最容易在参数值中简单地测试并None
在必要时替换它。
您可以编写一个装饰器来处理一般情况,它将使用检查工具箱来计算具有默认值的参数列表中的参数值,如果它们是None
.
下面的代码通过一些简单的测试用例演示了这个想法 - 这将起作用,但仅适用于*args, **kwargs
当前构成的具有简单参数(not )的函数。可以对其进行增强以涵盖这些情况。它像往常一样安全地处理没有默认值的参数。
蟒蛇小提琴
import inspect
def none2defaultdecorator(thisfunc):
(specargs, _, _, defaults) = inspect.getargspec(thisfunc)
def wrappedfunc(*instargs):
callargs = inspect.getcallargs(thisfunc, *instargs)
if len(specargs) != len(callargs):
print "Strange - different argument count in this call to those in spec"
print specargs
print callargs
for i,argname in enumerate(specargs[-len(defaults):]):
try:
if callargs[argname] == None:
callargs[argname] = defaults[i]
except KeyError:
# no local value for this argument - it will get the default anyway
pass
return thisfunc(**callargs)
return wrappedfunc
#Decorate the funtion with the "None replacer". Comment this out to see difference
@none2defaultdecorator
def test(binarg = True, myint = 5):
if binarg == True:
print "Got binarg == true"
elif binarg == False:
print "Got binarg == false"
else:
print "Didn't understand this argument - binarg == ", binarg
print "Argument values - binarg:",binarg,"; myint:",myint
test()
test(False)
test(True)
test(None)
test(None, None)