web-dev-qa-db-ja.com

Python:実行時に関数を動的に作成

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

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

考慮してください:

_def a(x):
    return x + 1
_

そのような関数をオンザフライで作成する方法は? compile('...', 'name', 'exec') itする必要がありますか?しかし、その後はどうなりますか?ダミー関数を作成し、そのコードオブジェクトをコンパイル手順からのコードオブジェクトに置き換えますか?

または、_types.FunctionType_を使用する必要がありますか?どうやって?

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

37
Ecir Hana

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)
20
Ahsan

execを使用:

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

特定のテンプレートから関数を動的に作成する必要がある場合は、この作品を試してください:

def create_a_function(*args, **kwargs):

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

    return function_template

my_new_function = create_a_function()

Function create_a_function()内で、選択するテンプレートを制御できます。内部関数function_templateはテンプレートとして機能します。作成者関数の戻り値は関数です。割り当て後、通常の関数としてmy_new_functionを使用します。

通常、このパターンは関数デコレーターに使用されますが、ここでも便利です。

12
kdw

これにはラムダを使用できます。

a = lambda x: x + 1
>>> a(2)
3
5
vishnu m c

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

この例では、私はparametrizing 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になります。

1
Berci