Python: динамически создавать функцию во время выполнения

Как динамически создавать функцию в Python?

Здесь я нашел несколько ответов, но не смог найти тот, который описывает наиболее общий случай.

Рассмотрим:

def a(x):
    return x + 1

Как создать такую ​​функцию на лету? У меня есть compile('...', 'name', 'exec') это? Но что тогда? Создание фиктивной функции и замена ее объекта кода на один из шагов компиляции?

Или использовать types.FunctionType? Как?

Я хотел бы настроить все: количество аргументов, их содержимое, код в теле функции, результат,...

Ответы

Ответ 1

Используйте exec:

>>> exec("""def a(x):
...   return x+1""")
>>> a(2)
3

Ответ 2

Вы видели этот, пример, который рассказывает вам, как использовать types.FunctionType

Пример:

import types

def create_function(name, args):
    def y(): pass

    y_code = types.CodeType(args,
                            y.func_code.co_nlocals,
                            y.func_code.co_stacksize,
                            y.func_code.co_flags,
                            y.func_code.co_code,
                            y.func_code.co_consts,
                            y.func_code.co_names,
                            y.func_code.co_varnames,
                            y.func_code.co_filename,
                            name,
                            y.func_code.co_firstlineno,
                            y.func_code.co_lnotab)

    return types.FunctionType(y_code, y.func_globals, name)

myfunc = create_function('myfunc', 3)

print repr(myfunc)
print myfunc.func_name
print myfunc.func_code.co_argcount

myfunc(1,2,3,4)
# TypeError: myfunc() takes exactly 3 arguments (4 given)

Ответ 3

Если вам нужно динамически создавать функцию из определенного шаблона, попробуйте эту часть:

def create_a_function(*args, **kwargs):

    def function_template(*args, **kwargs):
        pass

    return function_template

my_new_function = create_a_function()

Внутри функции create_a_function() вы можете управлять, какой шаблон выбрать. Внутренняя функция function_template служит в качестве шаблона. Возвращаемое значение функции creator является функцией. После назначения вы используете my_new_function как регулярную функцию.

Как правило, этот шаблон используется для декораторов функций, но также может быть полезен здесь.

Ответ 4

Как насчет этого подхода?

В этом примере я параметризую функции первого порядка по одной переменной (x → ax + b) в одном классе:

class Fun: 
  def __init__(self, a,b):
    self.a, self.b = a,b

  def f(self, x):
    return (x*self.a + self.b)

 u = Fun(2,3).f

Здесь u будет функция x- > 2x + 3.

Ответ 5

Вы можете использовать лямбда для этого.

a=lambda x:x+1
>>a(2)
3