【问题标题】:Replace package import in a module替换模块中的包导入
【发布时间】:2018-05-16 22:18:25
【问题描述】:

我使用一个模块,该模块使用相对导入点表示法将函数作为包导入导入:

from .utils import target_func

class ClassINeed:

    def function_i_call(self):
        return target_func()

我想用from classineed import ClassINeed 导入ClassINeed,但用我自己的函数替换target_func。问题是,target_func 不是我要导入的类的一部分。因此,我看不到访问它的方法。有什么方法可以做到这一点?

【问题讨论】:

    标签: python-3.x python-import monkeypatching


    【解决方案1】:

    from classineed import ClassINeed 之上,还可以执行import classineed,然后根据需要通过classineed.target_func = lambda : 'hello!' 覆盖target_func

    附:如果您已经拥有 import classineed,则使用 classineed.ClassINeed 引用类 ClassINeed 可能会更简洁。

    【讨论】:

    • 对我不起作用。这会替换我导入中的函数,但不会替换模块本身中的函数。当我实例化ClassINeed并调用function_i_need时,原始函数仍在被调用
    • 嗯,奇怪的是它当时对我有用。您能否在sys.modules 中找到该模块并在那里覆盖?在这里子类化ClassINeed 不是更好吗?
    • 我试图在 sys.modules 中覆盖。但这不起作用,因为该函数是作为相对点导入导入的。
    • 我想继承 ClassINeed 但我仍然需要替换 target_func
    • 通过unittest.mock.patch 就像with patch('package.classineed.target_func', new=lambda:123123): ... 可能是一种丑陋的做法那个。
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 2018-08-16
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多