如何在Python中动态创建函数?
我在这里看到了一些答案,但我找不到一个可以描述最常见情况的答案。
考虑:
def a(x):
return x + 1
如何即时创建此类功能?我必须compile('...', 'name', 'exec')
吗?那么呢?从编译步骤创建一个虚函数并替换它的代码对象?
或者我应该使用types.FunctionType
?怎么样?
我想自定义一切:参数的数量,它们的内容,函数体中的代码,结果,......
答案 0 :(得分:18)
您是否看到了this,其示例告诉您如何使用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)
答案 1 :(得分:17)
使用exec
:
>>> exec("""def a(x):
... return x+1""")
>>> a(2)
3
答案 2 :(得分:11)
如果您需要从某个模板动态创建一个函数,请试试这个:
SELECT teamName, test_teams.userID, test_teams.timestamp AS signup, sponsorship, test_results.timestamp, stadium, win+draw+lose AS games
FROM test_teams
INNER JOIN test_profile
ON test_teams.userID = test_profile.userID
INNER JOIN test_results
ON test_teams.userID = test_results.homeTeamId
WHERE test_teams.timestamp >= '2015-11-04 00:00:00' and win+draw+lose > 100
ORDER BY games desc;
在 create_a_function()函数中,您可以控制选择哪个模板。内部函数 function_template 用作模板。创建者函数的返回值是一个函数。分配后,您使用 my_new_function 作为常规函数。
通常,此模式用于函数装饰器,但也可以在此处使用。
答案 3 :(得分:5)
你可以使用lambda。
a = lambda x: x + 1
>>> a(2)
3
答案 4 :(得分:3)
您可以按照以下方式进行操作:
{{1}}
它类似于以前的exec解决方案。
答案 5 :(得分:1)
这种做法怎么样?
在这个例子中,我在一个类中的一个变量(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。