Мне нужно динамически вызывать метод для класса, который принимает различные параметры на основе имени строки и словаря переменных. Я знаю, как найти подпись с модулем проверки, и я могу получить метод с getattr, но я не знаю, как назначить параметры в правильном порядке, чтобы вызывать его чисто динамическим способом.Python3: динамический вызов метода со словарем параметров
class MyClass():
def call_me(a, b, *args, foo='bar', **kwargs):
print('Hey, I got called!')
command = {
'action':'call_me',
'parameters':{
'a': 'Apple',
'b': 'Banana',
'args':['one','two','three','four'],
'foo':'spam',
'clowns':'bad',
'chickens':'good'
}
}
me = MyClass()
action = getattr(me,command['action'])
... now what?
Мне нужно, чтобы иметь возможность динамически вызывать эту функцию, как если бы использовал этот код, без какого-либо предвидения фактических параметров методы:
a = command['parameters']['a']
b = command['parameters']['b']
args = command['parameters']['args']
foo = command['parameters']['foo']
kwargs = {
'clowns': command['parameters']['clowns'],
'chickens':command['parameters']['chickens']
}
value = action(a, b, *args, foo=foo, **kwargs)
Конечно есть хороший вещий способ сделай это.
Редактировать: Исправлено getattr для вызова экземпляра MyClass вместо MyClass напрямую.
'action (** command ['parameters'])' – falsetru
@falsetru Это не так просто из-за '* args'. – flornquake
'args = command ['parameters']. Pop ('args', None); action (** команда ['parameters'], * args) ' – refi64