运行时补丁python模块

时间:2014-12-09 13:53:15

标签: python monkeypatching python-importlib runpy

我正在寻找一种在替换进口时运行模块的方法。这将是在以下伪代码中实现run_patched的缺失魔法。

from argparse import ArgumentParser

class ArgumentCounter(ArgumentParser):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        arg_counter = 0
    def add_argument(self, *args, **kwargs):
        super().add_argument(*args, **kwargs)
        arg_counter += 1
    def parse_args(self, *args, **kwargs):
        super().parse_args(*args, **kwargs)
        print(arg_counter)

run_patched('test.test_argparse', ArgumentParser = ArgumentCounter)

我知道单个方法可以被赋值替换,例如声明ArgumentParser.parse_args = print,所以我很想弄掉像sys.modules这样的全局变量,然后按runpy.run_module执行模块。< / p>

不幸的是,整个策略应该能够在多线程场景中工作。因此,更改应该只影响执行的模块,而程序的其他部分可以继续使用未修补的模块,就好像它们从未被触及一样。

0 个答案:

没有答案