Ответ 1
Используйте exec
:
>>> exec("""def a(x):
... return x+1""")
>>> a(2)
3
Как динамически создавать функцию в Python?
Здесь я нашел несколько ответов, но не смог найти тот, который описывает наиболее общий случай.
Рассмотрим:
def a(x):
return x + 1
Как создать такую функцию на лету? У меня есть compile('...', 'name', 'exec')
это? Но что тогда? Создание фиктивной функции и замена ее объекта кода на один из шагов компиляции?
Или использовать types.FunctionType
? Как?
Я хотел бы настроить все: количество аргументов, их содержимое, код в теле функции, результат,...
Используйте exec
:
>>> exec("""def a(x):
... return x+1""")
>>> a(2)
3
Вы видели этот, пример, который рассказывает вам, как использовать 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)
Если вам нужно динамически создавать функцию из определенного шаблона, попробуйте эту часть:
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 как регулярную функцию.
Как правило, этот шаблон используется для декораторов функций, но также может быть полезен здесь.
Как насчет этого подхода?
В этом примере я параметризую функции первого порядка по одной переменной (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.
Вы можете использовать лямбда для этого.
a=lambda x:x+1
>>a(2)
3