インポートを置き換えながらモジュールを実行する方法を探しています。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)
単一のメソッドは、たとえば stating などの代入に置き換えることができることを知っているので、 のようなグローバルをいじってから、 でモジュールを実行ArgumentParser.parse_args = print
したくなりました。sys.modules
runpy.run_module
残念ながら、戦略全体はマルチスレッドのシナリオで機能するはずです。したがって、変更は実行されたモジュールにのみ影響し、プログラムの他の部分は、パッチが適用されていないモジュールをそのまま使用し続けることができます。