Ich muss einen Aufruf einer Funktion in einer anderen Funktion während der Laufzeit ändern.Ändern der Verweis auf Funktion in Laufzeit in Python
Betrachten Sie den folgenden Code ein:
def now():
print "Hello World!"
class Sim:
def __init__(self, arg, msg):
self.msg = msg
self.func = arg
self.patch(self.func)
def now(self):
print self.msg
def run(self):
self.func()
def patch(self, func):
# Any references to the global now() in func
# are replaced with the self.now() method.
def myfunc():
now()
Then ...
>>> a = Sim(myfunc, "Hello Locals #1")
>>> b = Sim(myfunc, "Hello Locals #2")
>>> b.run()
Hello Locals #2
>>> a.run()
Hello Locals #1
Ein Benutzer hat Code geschrieben, myfunc()
, die einen Aufruf zu einer global definierte Funktion macht now()
und ich kann es nicht ändern . Aber ich möchte, dass es stattdessen die Methode der Sim
Instanz aufruft. Also müsste ich die myfunc()
Funktion in Laufzeit "patchen".
Wie könnte ich darüber gehen?
Eine mögliche Lösung ist, den Bytecode wie hier getan zu bearbeiten: http://www.jonathon-vogel.com/posts/patching_function_bytecode_with_python/ aber ich frage mich, ob es einen einfacheren Weg gibt.
In Ihrem tatsächlichen Anwendungsfall sind 'now' und' myfunc' im selben Modul definiert? Interessiert es dich, wenn andere Nutzungen von "jetzt" betroffen sind? Wenn sie in verschiedenen Modulen sind, wie greift 'myfunc' dann auf die' now' Funktion zu? Der erforderliche Ansatz könnte ein bisschen anders sein, wenn er 'somemodule import now ... now()' vs 'importiert somemodule ... somemodule.now()'. – Weeble
Ja, es ist wichtig. Ich habe das Beispiel aktualisiert, um dies zu berücksichtigen. Der Endbenutzer würde die globalen Namen '' now'' und '' Sim'' aus einer Bibliothek in ihrem Code importieren. Ich könnte das globale '' now'' modifizieren, aber ich kann mir kein kostspieliges Nachschlagen innerhalb des globalen ''now'' leisten, um eine lokale Version zu finden. – jpcgt