Python使用getattr来调用具有可变参数的函数

lco*_*ral 20 python variables parameters function getattr

我正在使用getattr根据变量调用不同的函数.

我做这样的事情:

getattr(foo, bar) ()
Run Code Online (Sandbox Code Playgroud)

这工作,调用函数如foo.bar()

我的问题是我有'bar'功能,我想用不同的参数调用它.例如:

def f1() :
  pass

def f2(param1) :
  pass

def f3(param1,param2) :
  pass
Run Code Online (Sandbox Code Playgroud)

所以'bar'可以是f1,f2或f3

我试过这个:假设params是一个包含'bar'函数所需的所有参数的列表

getattr(foo, bar) (for p in params :)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个"干净"的解决方案,无需在params变量上观察长度

mgi*_*son 25

你可以尝试类似的东西:

getattr(foo, bar)(*params)
Run Code Online (Sandbox Code Playgroud)

如果params是列表或元组,则此方法有效.来自的元素params将按顺序解压缩:

params=(1, 2)
foo(*params)
Run Code Online (Sandbox Code Playgroud)

相当于:

params=(1, 2)
foo(params[0], params[1])
Run Code Online (Sandbox Code Playgroud)

如果有关键字参数,您也可以这样做.

getattr(foo, bar)(*params, **keyword_params)
Run Code Online (Sandbox Code Playgroud)

哪里keyword_params是字典.

此外,这个答案真的是独立的getattr.它适用于任何功能/方法.

  • 我知道OP并没有特别提出要求,但我也会添加`**kwargs`,因此如果他试图使用关键字参数,他最终也不会很难追踪错误. (2认同)

pro*_*sti 5

这在 Python 3 中非常简单。这是示例:

class C:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def m(self, x):
        print(f"{self.name} called with param '{x}'")
        return

ci = C("Joe", 10)
print(C)
print(ci)
print(C.m)
print(ci.m)
print(getattr(ci,'m'))
getattr(ci,'m')('arg')
Run Code Online (Sandbox Code Playgroud)
<class '__main__.C'>
<__main__.C object at 0x000001AF4025FF28>
<function C.m at 0x000001AF40272598>
<bound method C.m of <__main__.C object at 0x000001AF4025FF28>>
<bound method C.m of <__main__.C object at 0x000001AF4025FF28>>
Joe called with param 'arg'
Run Code Online (Sandbox Code Playgroud)

注意getattr来自builtins模块,在我们的例子中接受两个参数,类实例ci和表示函数名称的字符串。

我们还可以为参数定义默认值。

def m(self, x=None):
    print(f"{self.name} caled with param '{x}'")
    return
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们可以调用:

getattr(ci,'m')()
Run Code Online (Sandbox Code Playgroud)