【问题标题】:Monkeypatching inner importMonkeypatching 内部导入
【发布时间】:2019-12-16 12:18:33
【问题描述】:

我有 3 个文件(使用 py2)。

装饰者:

# decoratorfile.py
def deco(func):
   return func

使用装饰器的类:

# classfile.py
import decoratorfile
class Cla:
    @decoratorfile.deco
    def meth(self):
        pass

还有一个使用类文件的文件:

# excecution.py
from classfile import Cla
cla = Cla()
cla.meth()

我想对装饰器进行monkeypatch,我只能编辑execution.py 文件。 我该怎么做?

【问题讨论】:

    标签: python python-decorators monkeypatching


    【解决方案1】:

    只需猴子补丁deco 函数之前Cla 被定义(但在你import decoratorfile 之后)。以下内容将您的示例折叠到一个文件中,但如果您按照上一句进行操作,则将其分散到多个文件中不会影响结果。

    from functools import wraps
    
    def deco(func):
       return func
    
    def monkey_patch(func):
        @wraps(func)
        def with_print(*args, **kwargs):
            print("Hi")
            return func(*args, **kwargs)
        return with_print
    
    deco = monkey_patch # decoratorfile.deco = monkey_patch
    class Cla:
        @deco
        def meth(self):
            pass
    cla = Cla()
    cla.meth()
    

    输出

    Hi
    

    【讨论】:

    • 我忘了说我只能编辑execution.py
    • @Jochman 查看我的其他答案;我会留下这个,以防万一这个解决方案适合其他人的需求。
    【解决方案2】:

    有点小技巧,但您可以重写 import decoratorfile 以有效导入猴子修补的 deco 装饰器。

    $ cat monkeypatch.py 
    import decoratorfile
    from functools import wraps
    def monkey_patch(func):
        @wraps(func)
        def with_print(*args, **kwargs):
            print("Hi")
            return func(*args, **kwargs)
        return with_print
    
    decoratorfile.deco = monkey_patch
    
    $ cat execution.py 
    import inspect
    import classfile
    import monkeypatch
    
    classfile_source = inspect.getsource(classfile)
    monkeypatch_source = inspect.getsource(monkeypatch)
    exec(classfile_source.replace("import decoratorfile", monkeypatch_source))
    
    cla = Cla()
    cla.meth()
    
    $ python3 execution.py 
    Hi
    

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多