[python获取传递函数的参数

问题描述 投票:3回答: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

我查看了检查模块,但似乎无法掌握g中的f

就我的编程知识所掌握的为止:

def g(f):
  print(list(inspect.signature(f).parameters.keys()))

[g(f(1,2))结果为:TypeError: None is not a callable object

python meta inspect
3个回答
1
投票

您需要适当地调用g,因此[f作为函数是一个参数:

g(f, 1, 2)

现在将其用于您的功能:

def g(f, *args):
  print(list(inspect.signature(f).parameters.keys()))

...,然后从这里可以循环访问args以正确调用f

让您动起来吗?


2
投票

这是不可能的。当您调用g(f(1,2))时,f(1,2)g运行之前完成。唯一可行的方法是f返回其参数。


0
投票

您可以做这样的事情:

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,但这是另一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.