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')()