Скажем, у меня есть какая-то функция fun
, фактическое тело кода которой находится вне моего контроля.Я могу создать новую функцию, которая выполняет некоторую предварительную обработку перед вызовом fun
, то есть
def process(x):
x += 1
return fun(x)
Если я теперь хочу, чтобы process
занял место fun
для всех будущих вызовов fun
,Мне нужно сделать что-то вроде
# Does not work
fun = process
Это не работает, однако, так как это создает циклическую справочную проблему, поскольку теперь fun
вызывается из тела fun
.Одно решение, которое я нашел, состоит в том, чтобы сослаться на копию fun
внутри process
, например так:
# Works
import copy
fun_cp = copy.copy(fun)
def process(x):
x += 1
return fun_cp(x)
fun = process
, но это решение беспокоит меня, так как я действительно не знаю, как Python создает копиюфункция.Я предполагаю, что моя проблема идентична проблеме расширения метода класса с использованием наследования и функции super
, но здесь у меня нет класса.
Как я могу сделать это правильно?Я бы подумал, что это достаточно распространенная задача, что должно существовать какое-то более или менее идиоматическое решение, но мне не повезло найти его.