65

Pythonで関数を動的に作成するには?

ここでいくつかの回答を見ましたが、最も一般的なケースを説明するものは見つかりませんでした。

検討:

def a(x):
    return x + 1

そのような関数をオンザフライで作成する方法は? 私はそれをしなければcompile('...', 'name', 'exec')なりませんか?しかし、その後は?ダミー関数を作成し、そのコード オブジェクトをコンパイル ステップのコード オブジェクトに置き換えますか?

または、使用する必要がありますtypes.FunctionTypeか?どのように?

すべてをカスタマイズしたいと思います: 引数の数、その内容、関数本体のコード、結果など...

4

7 に答える 7

38

使用exec

>>> exec("""def a(x):
...   return x+1""")
>>> a(2)
3
于 2012-07-02T10:25:45.577 に答える
32

これを見ましたかそれは使用方法を説明する例です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)
于 2012-07-02T11:15:04.873 に答える
6

このアプローチはどうですか?

この例では、1 つのクラスの 1 つの変数 (x -> ax+b) で 1 次関数をパラメーター化しています。

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 があります。

于 2015-07-17T10:36:28.313 に答える