it-swarm.com.de

Python: Funktion zur Laufzeit dynamisch erstellen

Wie erstelle ich dynamisch eine Funktion in Python?

Ich habe hier ein paar Antworten gesehen, aber ich konnte keine finden, die den allgemeinsten Fall beschreiben würde.

Erwägen:

def a(x):
    return x + 1

Wie erstelle ich eine solche Funktion im laufenden Betrieb? Muss ich es compile('...', 'name', 'exec')? Aber was dann? Erstellen einer Dummy-Funktion und Ersetzen ihres Code-Objekts für eine aus dem Kompilierungsschritt?

Oder soll ich types.FunctionType Verwenden? Wie?

Ich möchte alles anpassen: Anzahl der Argumente, deren Inhalt, Code im Funktionskörper, das Ergebnis, ...

37
Ecir Hana

Haben Sie this gesehen? Dies ist ein Beispiel, das Ihnen die Verwendung von types.FunctionType Erklärt.

Beispiel:

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

Benutze exec:

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

Wenn Sie eine Funktion aus einer bestimmten Vorlage dynamisch erstellen müssen, versuchen Sie Folgendes:

def create_a_function(*args, **kwargs):

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

    return function_template

my_new_function = create_a_function()

Innerhalb der Funktion create_a_function () können Sie steuern, welche Vorlage Sie auswählen möchten. Die innere Funktion function_template dient als Vorlage. Der Rückgabewert der Erstellerfunktion ist eine Funktion. Nach der Zuweisung verwenden Sie my_new_function als reguläre Funktion.

Normalerweise wird dieses Muster für Funktionsdekoratoren verwendet, kann aber auch hier nützlich sein.

12
kdw

Sie können dafür Lambda verwenden.

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

Was ist mit diesem Ansatz?

In diesem Beispiel bin ich Parametrisierung Funktionen erster Ordnung für eine Variable (x -> ax + b) in einer Klasse:

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

Hier ist u die Funktion x-> 2x + 3.

1
Berci