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)

単一のメソッドは、たとえば stating などの代入に置き換えることができることを知っているので、 のようなグローバルをいじってから、 でモジュールを実行ArgumentParser.parse_args = printしたくなりました。sys.modulesrunpy.run_module

残念ながら、戦略全体はマルチスレッドのシナリオで機能するはずです。したがって、変更は実行されたモジュールにのみ影響し、プログラムの他の部分は、パッチが適用されていないモジュールをそのまま使用し続けることができます。

4

0 に答える 0