Python с использованием getattr для вызова функции с переменными параметрами
Я использую 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
Ответы
Ответ 1
Вы можете попробовать что-то вроде:
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
. Он будет работать для любой функции/метода.
Ответ 2
Это очень просто в 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 из встроенного модуля, в нашем случае принимает два параметра, экземпляр класса ci
и строку, представляющую имя функции.
Мы также можем определить значение по умолчанию для параметра.
def m(self, x=None):
print(f"{self.name} caled with param '{x}'")
return
В этом случае мы можем позвонить:
getattr(ci,'m')()