Ho bisogno di cambiare una chiamata a una funzione all'interno di un'altra funzione durante l'esecuzione.Cambia riferimento alla funzione in fase di esecuzione in Python
Si consideri il seguente codice:
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()
Poi ...
>>> a = Sim(myfunc, "Hello Locals #1")
>>> b = Sim(myfunc, "Hello Locals #2")
>>> b.run()
Hello Locals #2
>>> a.run()
Hello Locals #1
Un utente ha scritto il codice, myfunc()
, che effettua una chiamata a una funzione definita a livello globale now()
e non posso modificarlo . Ma voglio invece chiamare il metodo dell'istanza Sim
. Quindi avrei bisogno di "patchare" la funzione myfunc()
in fase di esecuzione.
Come posso andare su questo?
Una possibile soluzione è di modificare il bytecode come fatto qui: http://www.jonathon-vogel.com/posts/patching_function_bytecode_with_python/ ma mi chiedo se c'è un modo più semplice.
Nel vostro caso d'uso effettivo, sono 'now' e' myfunc' definiti nello stesso modulo l'uno dell'altro? Ti importa se altri usi di "now" sono interessati? Se sono in moduli diversi, in che modo 'myfunc' accede alla funzione' now'? L'approccio richiesto potrebbe essere un po 'diverso se fosse 'da somemodule import now ... now()' vs 'import somemodule ... somemodule.now()'. – Weeble
Sì, importa. Ho aggiornato l'esempio per tener conto di ciò. L'utente finale importerebbe il globale '' now'' e '' Sim'' da una libreria nel loro codice. Potrei modificare il globale '' now'', ma non posso permettermi una costosa ricerca all'interno del globale '' now'' per trovare una versione locale. – jpcgt