Python:在运行时动态创建函数

时间:2012-07-02 09:47:37

标签: python function runtime

如何在Python中动态创建函数?

我在这里看到了一些答案,但我找不到一个可以描述最常见情况的答案。

考虑:

def a(x):
    return x + 1

如何即时创建此类功能?我必须compile('...', 'name', 'exec')吗?那么呢?从编译步骤创建一个虚函数并替换它的代码对象?

或者我应该使用types.FunctionType?怎么样?

我想自定义一切:参数的数量,它们的内容,函数体中的代码,结果,......

6 个答案:

答案 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。