私は現在、非常に大きなファイルをメモリにロードし、使用する前に高価なセットアップ操作を行う必要があるコードを c++ から python に移植しています。このコードでは、大きなルックアップ テーブルを使用して、タイム クリティカルな関連関数のグループの実行時間を短縮しています (5 つを超える関数がこの同じテーブルを広範囲に使用しています)。この状況は、コードの単体テストでうまく処理されていると思います。
class LookupTableTests(object):
@classmethod
def setup_class(cls):
"""Load the lookup table instance used by the rest of the tests.
"""
from fasteval import LookupTable
cls.lt = LookupTable.loadfile()
@classmethod
def teardown_class(cls):
"""Free the lookup table instance used in these tests.
"""
cls.lt.close()
cls.lt = None
単体テストのコンテキストでは、これは私にとって非常に理にかなっています。一度テーブルをセットアップしてから一連のテストを実行すると、全体として実行時間が大幅に節約されます (このテーブルをロードして他の初期化を行うのは遅いです)。
ただし、単体テスト以外では、ルックアップ テーブルを使用する関数のグループ全体に対して、セットアップとクリーンアップが 1 回だけ実行されるようにする最適な方法がわかりません。
これまでのところ、セットアップが実行されたかどうかを示すグローバルを定義することをお勧めします。しかし、これは私には醜いように思えます。また、未処理の例外がどこかでスローされた場合、クリーンアップが適切に処理されないという問題も発生します。これを c++ で行っていた場合、RAII の原則を使用して、リソースを管理するためにデストラクタでクリーンアップを実行しようとしていると思いますが、Python でこれを行う適切な方法がわかりません。
すべて同じセットアップとクリーンアップを必要とする関連関数のグループがある状況に対処する Pythonic の方法は何ですか? このソリューションはどのような構造になりますか?