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
Die gewünschte Ausgabe ist (Datei /tmp/code.py
):
Die Ausgabe, die ich bekomme, ist (Datei '/tmp/code.py'
):
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.
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:
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).
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 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
Also, ich habe endlich so etwas gemacht.
%Vor%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%Tags und Links python