首页 > 解决方案 > python Monkey 修补一个新类并导入它

问题描述

我想修补一个新类,然后导入该类,但出现错误 ModuleNotFoundError。同时我可以使用新的补丁功能。我相信我想念如何将它添加到“ init ”文件中。

请参阅以下简化示例:

import numpy
class wrong_functions():
    def wrong_add(num1, num2):
        return num1 + num2 + 1

numpy.random.wrong_functions = wrong_functions
numpy.random.wrong_functions.wrong_add(1,1) # works
from numpy.random.wrong_functions import wrong_add # does not work
from numpy.random.wrong_functions import * # does not work

你怎么看?那可能吗?

标签: pythonmonkeypatching

解决方案


这是因为导入系统

通读文档,您可以找到以下段落:

[...] 该声明from spam.ham import eggs, sausage as saus导致

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage

问题是:做什么__import__()

import语句结合了两个操作;它搜索命名模块,然后将搜索结果绑定到本地范围内的名称。[...]

直接调用__import__()仅执行模块搜索,如果找到,则执行模块创建操作。

因此,当您重新导入模块时,您的自定义将丢失。

为了确保它保持打开状态,您可以import numpy as np然后在使用时np- 在您评估这个新类之后 - 您始终可以访问wrong_add.

>>> import numpy as np
>>> np.random.wrong_functions = wrong_functions
>>> np.random.wrong_function.wrong_add(1, 1)
3

编辑:如果您需要/只想调用wrong_add而不是完整的包路径来调用函数,您可以随时将其分配给变量。

>>> wrong_add = np.random.wrong_function.wrong_add
>>> wrong_add(2, 2)
5

推荐阅读