我想将一个函数f(a = 1,b = 2)传递给g并在g中使用'a'值
def f(a,b): pass
def g(f): #print f.a
[g(f(1,2))
应该导致输出为1
我查看了检查模块,但似乎无法掌握g中的f
就我的编程知识所掌握的为止:
def g(f):
print(list(inspect.signature(f).parameters.keys()))
[g(f(1,2))
结果为:TypeError: None is not a callable object
您需要适当地调用g
,因此[f
,作为函数是一个参数:
g(f, 1, 2)
现在将其用于您的功能:
def g(f, *args):
print(list(inspect.signature(f).parameters.keys()))
...,然后从这里可以循环访问args
以正确调用f
。
让您动起来吗?
这是不可能的。当您调用g(f(1,2))
时,f(1,2)
在g
运行之前完成。唯一可行的方法是f
返回其参数。
您可以做这样的事情:
def f(a, b):
print(a)
print(b)
然后将包装定义为:
def wrapper(func, a, b):
func(a, b)
或者,如果您想要更大的灵活性,请使用* args:
def wrapper(func, *args):
func(*args)
如果参数数量不匹配,灵活性会带来一定的风险。这意味着您需要注意传递给wrapper的所有func具有一致的签名。
您可以使用** kwargs来解决上述问题,然后:
def wrapper(func, **kwargs):
func(**kwargs)
然后调用wrapper看起来像:
wrapper(f, a=1, b=2)
这将提供更大的灵活性,并且func的签名可以根据需要进行更改。
您可以将wrapper变成decorator,但这是另一个问题。