我正在寻找一种在替换导入时运行模块的方法。这将是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
。
不幸的是,整个策略应该能够在多线程场景中工作。因此,更改应该只影响执行的模块,而程序的其他部分可以继续使用未修补的模块,就好像它们从未被触及过一样。