python 获取传递函数的参数
python get parameters of passed function
我想将函数 f(a=1,b=2) 传递给 g 并在 g
中使用 'a' 值
def f(a,b): pass
def g(f): #print f.a
g(f(1,2))
应该导致输出 1
我查看了 inspect 模块,但似乎无法在 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(1,2))
时,f(1,2)
在 g
运行之前完成。唯一可能的方法是 f
到 return 它的参数。
您需要适当地调用 g
,因此 f
、 作为函数,是一个参数:
g(f, 1, 2)
现在将其应用到您的函数中:
def g(f, *args):
print(list(inspect.signature(f).parameters.keys()))
... 从这里开始,您可以遍历 args
以正确调用 f
.
这让你感动吗?
你可以这样做:
def f(a, b):
print(a)
print(b)
然后定义wrapper为:
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 但这是另一个问题。
我想将函数 f(a=1,b=2) 传递给 g 并在 g
中使用 'a' 值def f(a,b): pass
def g(f): #print f.a
g(f(1,2))
应该导致输出 1
我查看了 inspect 模块,但似乎无法在 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(1,2))
时,f(1,2)
在 g
运行之前完成。唯一可能的方法是 f
到 return 它的参数。
您需要适当地调用 g
,因此 f
、 作为函数,是一个参数:
g(f, 1, 2)
现在将其应用到您的函数中:
def g(f, *args):
print(list(inspect.signature(f).parameters.keys()))
... 从这里开始,您可以遍历 args
以正确调用 f
.
这让你感动吗?
你可以这样做:
def f(a, b):
print(a)
print(b)
然后定义wrapper为:
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 但这是另一个问题。