Мне нужно изменить вызов функции внутри другой функции во время выполнения.Изменить ссылку на функцию во время выполнения в Python
Рассмотрим следующий код:
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()
Тогда ...
>>> a = Sim(myfunc, "Hello Locals #1")
>>> b = Sim(myfunc, "Hello Locals #2")
>>> b.run()
Hello Locals #2
>>> a.run()
Hello Locals #1
Один пользователь написал код, myfunc()
, что делает вызов глобально определенной функции now()
, и я не могу изменить его , Но я хочу, чтобы он вместо этого вызывал метод экземпляра Sim
. Поэтому мне нужно будет «запланировать» функцию myfunc()
во время выполнения.
Как я могу это сделать?
Одним из возможных решений является отредактировать байт-код, как это делается здесь: http://www.jonathon-vogel.com/posts/patching_function_bytecode_with_python/, но мне интересно, есть ли более простой способ.
В вашем фактическом прецеденте используются 'now' и' myfunc', определенные в том же модуле, что и другие? Вам небезразлично, повлияли ли другие применения «сейчас»? Если они находятся в разных модулях, как 'myfunc' получает доступ к функции' now'? Необходимый подход может быть немного иным, если он «из импорта somemodule now ... now()' vs 'import somemodule ... somemodule.now()'. – Weeble
Да, это имеет значение. Я обновил этот пример, чтобы объяснить это. Конечный пользователь будет импортировать глобальные '' now'' и '' Sim'' из библиотеки в свой код. Я мог бы изменить глобальный '' now'', но я не могу позволить себе дорогостоящий поиск внутри глобального '' now'', чтобы найти локальную версию. – jpcgt