我正在使用getattr根据变量调用不同的函数。
我正在做类似的事情:
getattr(foo, bar) ()
这样做,调用foo.bar()等函数
我的问题是我有'bar'功能,我想用不同的参数调用它。例如:
def f1() :
pass
def f2(param1) :
pass
def f3(param1,param2) :
pass
所以'bar'可以是f1,f2或f3
我试过这个: 假设params是一个列表,其中包含“bar”函数所需的所有参数
getattr(foo, bar) (for p in params :)
我正在寻找一个“干净”的解决方案,而不需要在params变量上观察长度
答案 0 :(得分:22)
您可以尝试以下方式:
getattr(foo, bar)(*params)
如果params
是列表或元组,则此方法有效。来自params
的元素将按顺序解压缩:
params=(1, 2)
foo(*params)
相当于:
params=(1, 2)
foo(params[0], params[1])
如果有关键字参数,您也可以这样做。
getattr(foo, bar)(*params, **keyword_params)
其中keyword_params
是字典。
此外,这个答案实际上独立于getattr
。它适用于任何函数/方法。
答案 1 :(得分:1)
一种可能更具可读性的方式,对于处理异常更好:
class foo:
def method_xy(self, *args, **kwargs):
print(f'args:{args}, kwargs:{kwargs}')
bar = 'method_xy'
xi = foo()
try:
func_name = getattr(xi, bar)
except AttributeError:
# handle missing method
pass
args = ['bla1', 'bla2']
kwargs = {'a1': 1, 'a2': 2}
try:
result = func_name(*args, **kwargs)
except TypeError:
# handle Problems with arguments
pass
答案 2 :(得分:0)
这在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')
<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'
请注意,getattr来自builtins模块,在我们的例子中采用了两个参数,即类实例ci
和代表函数名称的字符串。
我们还可以为参数定义默认值。
def m(self, x=None):
print(f"{self.name} caled with param '{x}'")
return
在这种情况下,我们可以致电:
getattr(ci,'m')()