在 original.py 中,它不是由我自己控制的
def func():
print("func")
有没有办法修补 original.func?
patch_original.py,由我自己控制
def patched_func():
original.func()
print("patched_func")
call.py
import original # can not change this
import patch_original
func()
我希望能够打印
函数
patched_func
更新:original.py 不受我的控制。
patch_original.py是完全可控的。
call.py 部分在我的控制之下,它已经导入了原版
这种补丁非常适合装饰器模式:
在original.py
:
def func():
print("func")
在patch_original
:
def patch(f): # this function is a decorator
def p():
f()
print("patched_func")
return p
在call.py
:
import original
import patch_original
func = patch_original.patch(original.func) # here we decorate `original.func`
func()
运行call.py
:
Juans-MacBook-Pro:temp juan$ python call.py
func
patched_func
Juans-MacBook-Pro:temp juan$
然后,您可以在call.py
中定义新函数时重用此补丁:
import original
import patch_original
func = patch_original.patch(original.func)
func()
@patch_original.patch # decorator syntax
def func2():
print("func2")
func2()
并运行这个:
Juans-MacBook-Pro:temp juan$ python call.py
func
patched_func
func2
patched_func
在patch_original.py
中执行此操作:
import original
_original_func = original.func
def patched_func():
_original_func()
print("patched_func")
然后在主脚本中:
import patch_original
func = patch_original.patched_func
original.py
def func():
print("func")
patch_original.py
import original
def patched_func():
original.func()
print("patched_func")
call.py
import original
import patch_original
patch_original.patched_func()