python-3.x - Python - 猴子补丁失败,为什么?
问题描述
f(*args, **kwargs)
我想从已安装的模块中进行修补。我在自己的代码上使用了装饰器的想法,但是已安装模块中的其他方法无法f
正确调用。
这是一个例子:
import numpy as np
def log(func):
def wrapper(*args, **kwargs):
print('logging')
return func(*args, **kwargs)
return wrapper
if __name__ == "__main__":
a1 = np.asarray([0, 1, 2])
print(f'a1={a1}')
a2 = np.array([0, 1, 2])
print(f'a2={a2}')
np.array = log(np.array)
a3 = np.asarray([0, 1, 2])
print(f'a3={a3}')
a4 = np.array([0, 1, 2])
print(f'a4={a4}')
输出是:
a1=[0 1 2]
a2=[0 1 2]
a3=[0 1 2]
logging
a4=[0 1 2]
我希望结果是:
a1=[0 1 2]
a2=[0 1 2]
logging
a3=[0 1 2]
logging
a4=[0 1 2]
因为在源代码中asarray
调用。array
我的问题是: 1. 为什么猴子补丁会失败?2.如何解决?
解决方案
通过np.array = log(np.array)
您更改“公共”名称np.array
所指的功能。
但是np.asarray
在numpy.core.numeric
模块中定义,它有自己的“私有”名称来引用该函数。它不受修补公共名称的影响。
您必须修补私有名称:
np.core.numeric.array = log(np.array)
推荐阅读
- batch-file - ffmpeg 将带有批处理脚本的视频设备列表到变量
- excel - 如果没有单元格可以使用特殊粘贴复制并粘贴到新工作表中,则会出现代码错误
- c# - 删除xml节点c#的属性
- hyperledger-fabric - 为什么在 Hyperledger Fabric 中使用区块链结构?
- angular - Nativescript的代码共享项目中无法安装Angular Material
- excel - 将单元格用作 Range 参数时的 Byref 不匹配
- django - 如何修复配置不当的异常?
- java - Java KeyAdapter 与 Swing 键绑定?
- java - ScrollPane 自行向下滚动
- c++ - C++ 对象值突然变为 NULL,没有相关的先前指令