0

我正在寻找一种在替换导入时运行模块的方法。这将是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

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

4

0 回答 0