Python 如何在另一个模块中修补一个函数并在内部调用它



在 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()

最新更新