Есть ли способ динамически создавать и вызывать функцию в Python?

#python #function-call

Вопрос:

Мое заявление заключается в следующем:

  • У меня есть функция исполнителя, которая должна выполнить некоторый код на основе переключателя, который отправляется в качестве аргумента. Он сохраняет ссылки на несколько функций и выбирает необходимую функцию на основе переключателя. Дело в том, что эти функции имеют разное количество параметров.

напр.

 class Execute:

  def func1(self, f1_arg):
      print("f1_arg", f1_arg)

  def func2(self, f2_arg1, f2_arg2):
      print("arguments: %s and %s" % (f2_arg1, f2_arg2))

  def executor(self, sw):
      available_functions = {
                        "sw1": self.func1,
                        "sw2": self.func2
                        }
      predefined_arguments = {
                        "sw1": "f1_argument",
                        "sw2": ("f2_argument1", "f2_argument2")
                        }
      # this is pseudo code, I have no idea how to do it
      available_functions[sw](predefined_arguments[sw])
 

Комментарии:

1. Всегда ли аргументы внутри статичны executer ?

2. Причина eval , по которой он считается опасным, заключается в том, что он обладает такой способностью.

3. В случае sw2 , если вы просто передаете один кортеж в качестве аргумента. Вместо этого также создайте аргумент sw1 кортежа ( ("f1_argument",) ), а затем распакуйте кортежи в вызове функции available_functions[sw](*predefined_arguments[sw])

4. Это в основном то, что functools.partial делает. p = partial(func1, arg1); p() это то же func1(arg1) самое, что .

5. Спасибо, ребята. Дело в том, что это слишком упрощенный пример. Функции, которые я должен вызывать, взяты из модуля, который я не могу изменить. Кроме того, функции имеют статические аргументы … так что никаких *аргументов