Funktion mit Argumenten erzeugen, die beim Erstellen ausgefüllt wurden?

8

Mein Ziel ist es, Funktionen dynamisch zu generieren und sie dann in einer Datei zu speichern. Zum Beispiel, in meinem aktuellen Versuch, beim Aufruf von create_file

%Vor%

Die gewünschte Ausgabe ist (Datei /tmp/code.py ):

%Vor%

Die Ausgabe, die ich bekomme, ist (Datei '/tmp/code.py' ):

%Vor%

UPDATE: Meine Lösung verwendet inspect.getsource , das eine Zeichenfolge zurückgibt. Ich frage mich, ob ich Ihre Möglichkeiten eingeschränkt habe, da die meisten Lösungen einen String-Ersatz vorschlagen. Die Lösung muss nicht inspect.getsource verwenden. Sie könnten es trotzdem schreiben, um die gewünschte Ausgabe zu erhalten.

UPDATE 2: Der Grund dafür ist, dass ich eine Datei für Amazon Lambda erzeugen möchte. Amazon Lambda nimmt eine Python-Datei und ihre virtuelle Umgebung und führt sie für Sie aus (damit Sie sich nicht um Skalierbarkeit und Fehlertoleranz sorgen müssen). Sie müssen Lambda mitteilen, welche Datei und welche Funktion aufgerufen werden soll und Lambda wird sie für Sie ausführen.

    
RAbraham 26.01.2017, 20:39
quelle

6 Antworten

3

Verwenden Sie getsource , um die Funktion in eine Zeichenfolge zu konvertieren, und ersetzen Sie die Variablennamen durch einfache Zeichenfolgenmanipulation.

%Vor%

Die Ausgabe ist wie erwartet in /tmp/code.py:

%Vor%     
Håken Lid 26.01.2017, 21:56
quelle
3

Eine Funktionsdefinition sucht ihre freien Variablen (Variablen, die nicht in der Funktion selbst definiert sind) zum Zeitpunkt der Definition nicht nach. I.e. concrete_func hier:

%Vor%

sucht nicht nach a_value , wenn es definiert ist, stattdessen enthält es Code, um a_value zur Laufzeit zu laden (vereinfacht die umschließende Funktion).

Sie können dies durch Zerlegen der zurückgegebenen Funktion sehen:

%Vor%

Sie können vielleicht tun, was Sie wollen, indem Sie den Byte-Code bearbeiten. Es wurde schon einmal gemacht ( Ссылка ..shudder).

    
thebjorn 26.01.2017 21:16
quelle
1

Versuchen Sie es. Beachten Sie, dass ich einen weiteren Parameter zu write_to_file

hinzugefügt habe %Vor%     
Shijo 26.01.2017 20:55
quelle
1

Wenn die Datei nicht für den Menschen lesbar sein muss und Sie darauf vertrauen, dass sie nicht von Angreifern manipuliert wird, kombinieren Sie functools.partial und pickle könnte der pythischste Ansatz sein . Es kommt jedoch mit Nachteilen, die ich nicht vollständig verstehe: Zum einen scheint es nicht mit lokal definierten Funktionen (oder vielleicht lokal definierten Variablen im Allgemeinen?) Zu funktionieren.

Ich könnte nur meine eigene Frage dazu stellen.

%Vor%     
Ben 26.01.2017 21:44
quelle
1

@Ben machte mir klar, dass ich keinen String-basierten Ansatz für die Code-Generierung verwenden musste und Serialisierung verwenden konnte. Anstelle der eingeschränkten pickle -Bibliothek habe ich dill verwendet, wodurch die Begrenzung, wie sie von Ben

erwähnt wird, überwunden wird

Also, ich habe endlich so etwas gemacht.

%Vor%     
RAbraham 01.02.2017 17:36
quelle
0

Wenn die Funktion, die Sie erstellen wollen, alle ein bestimmtes Muster haben, würde ich eine Vorlage für sie erstellen und sie verwenden, um die Funktionen

massenweise zu erzeugen %Vor%     
Copperfield 26.01.2017 21:10
quelle

Tags und Links