Функции Python являются объектами и являются атрибутами их модулей, так что вы можете просто установить модуль один раз при запуске (т.е. в вашем основном скрипте):
# this has to be executed BEFORE any use of `mylib.myfun`
import mylib
def patch_myfun():
realfun = mylib.myfun
if mylib.version < needed:
# Env 1
def patched(*args, extra_arg=None):
return realfun(*args)
else:
# Env 2
def patched(*args, extra_arg=None):
return realfun(*args, extra_arg=extra_arg)
mylib.myfun = patched
patch_my_fun()
Примечание: этот код должен выполняться толькоконечно, один раз за процесс (иначе myfun
будет исправлено более одного раза).Лучший способ убедиться в этом - поместить его в верхнюю часть скрипта или в модуль, который импортируется перед любым использованием mylib.myfun
- для модуля код верхнего уровня выполняется только один раз (для каждого процесса) в первый раз.после импорта модуля следующий импорт извлечет только загруженный модуль из sys.modules
.