Python获取传递函数的参数

3
我想把一个函数 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不是可调用对象

3个回答

2
这是不可能的。当你调用g(f(1,2))时,f(1,2)g运行之前就已经完成了。唯一可能的情况是f返回它的参数。

1
你需要适当地调用g,使f作为函数成为一个参数:
g(f, 1, 2)

现在将其纳入你的函数中:
def g(f, *args):
  print(list(inspect.signature(f).parameters.keys()))

从这里开始,您可以遍历args以进行适当的对f的调用。

这能帮到您吗?


是的,这非常有帮助,因为我无法直接访问g中f的参数...谢谢。 - smithsomizm

0
你可以像这样做:
def f(a, b):
    print(a)
    print(b)

然后将wrapper定义为:

def wrapper(func, a, b):
    func(a, b)

或者如果您想要更多的灵活性,可以使用*args:

def wrapper(func, *args):
    func(*args)

这种灵活性也带来了一些风险,如果参数数量不匹配的话。这意味着您需要确保所有传递给wrapperfunc具有一致的签名。

您可以使用**kwargs来帮助解决上述问题,然后:

def wrapper(func, **kwargs):
    func(**kwargs)

那么对于wrapper的调用将会是这样的:

wrapper(f, a=1, b=2)

这将允许更多的灵活性,func的签名可以根据需要变化。

你可以把wrapper转换成一个装饰器,但那是另一个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接