【问题标题】:python monkey patch a new class and import itpython Monkey 修补一个新类并导入它
【发布时间】:2021-06-17 17:25:56
【问题描述】:

我想修补一个新类,然后导入该类,但我收到一个错误 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

你怎么看?这可能吗?

【问题讨论】:

    标签: python monkeypatching


    【解决方案1】:

    这是因为import system

    通读文档,你可以找到这一段:

    [...] 语句 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2014-03-22
      • 2011-03-27
      • 2017-05-24
      • 2011-12-15
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多