我想知道如何调用一个函数,传递一个它可能不期望的参数。
几天前我遇到了这个问题,并找到了解决方法。但是今天,我决定看看我想做的事情是否可行。不幸的是,我不记得我使用它的上下文。所以这是一个愚蠢的例子,其中有很多更好的方法可以做到这一点,但请忽略这一点:
def test(func, arg1, arg2):
return func(arg1, arg2, flag1=True, flag2=False) #Only pass the flags if the function accepts them.
def func1(a, b, flag1, flag2):
ret = a
if flag1:
ret *= b
if flag2:
ret += b
return ret
def func2(a, b):
return a*b
print test(func1, 5, 6) #prints 30
我想出的替代方案如下所示:
def test(func, arg1, arg2):
numArgs = len(inspect.getargspec(func).args)
if numArgs >= 4:
return func(arg1, arg2, True, False)
elif numArgs == 3:
return func(arg1, arg2, True)
else:
return func(arg1, arg2)
print test(func2, 5, 6) #prints 30
或尝试..except.. 块
但是在不改变 func1 和 func2 的情况下必须有更好的方法,对吧?
(编辑):利用 Max S 提供的解决方案,我认为这是最好的方法:
def callWithOptionalArgs(func, *args):
argSpec = inspect.getargspec(func)
lenArgSpec = len(argSpec.args or ())
argsToPass = args[:lenArgSpec] #too many args
defaults = argSpec.defaults or ()
lenDefaults = len(defaults)
argsToPass += (None, )*(lenArgSpec-len(argsToPass)-lenDefaults) #too few args
argsToPass += defaults[len(argsToPass)+len(defaults)-lenArgSpec:] #default args
return func(*argsToPass)
print callWithOptionalArgs(func1, 5, 6, True) #prints 30
print callWithOptionalArgs(func2, 5, 6, True) #prints 30