1

私は科学的データ分析用のアプリケーションを作成していますが、循環インポートの問題を回避 (または対処) するためにコードを構造化する最良の方法は何か疑問に思っています。現在、OO と手続き型プログラミングを組み合わせて使用​​しています。

他の質問はこの問題に対処しますが、より抽象的な方法です。ここでは、より具体的なコンテキストで最適なソリューションを探しています。

データがリストおよび/または配列で構成されるクラスがContainer定義されています。DataLib.pyすべてのメソッドとサポート機能を使用すると、DataLib.py非常に大きくなります (〜 1000 行)。

さまざまな基準に従ってSelectionLib.pyデータを「フィルタリング」する関数のみを含む2 番目のモジュール(〜 400 行) があります。これらの関数は新しいオブジェクト (フィルター処理されたデータを含む) をContainer返すため、からインポートする必要があります。論理的には、これらの関数は「コンテナー」の「メソッド」であり、python 関数を使用して実装されているだけであることに注意してください。ContainerSelectionLib.pyContainerDataLib.py

Containerここで、複雑な分析をメソッド呼び出しの 1 つの関数で実行できるように、いくつかの高レベルのメソッドを追加したいと考えています。そして、「複雑な分析」とは、任意の数のContainerメソッド呼び出し、ローカル関数 (DataLib.py で定義)、およびフィルター関数 (で定義)を意味しSelectionLib.pyます。

したがって、問題は、フィルター関数を使用するDataLib.py ためにインポートする必要があることですが、既にインポートしています。SelectionLib.pySelectionLib.pyDataLib.py

私のハックな解決策は、 IPythonからrun -i ...を使用して2つのファイルを実行することであることを知っているので、大きな単一のファイルを持っているようなもので、循環インポートを避けます。しかし同時に、このスクリプトを GUI などに統合することは困難です。

この問題をどのように解決することをお勧めしますか:

  1. 純粋な OO と継承を使用し、オブジェクトを 3 つに分割します: CoreContainer-> SelectionContainer->HighLevelContainer

  2. コードの再構築 (すべてを 1 つのファイルに?)

  3. ある種のインポートの策略(インポートを最後に置く)

どんなフィードバックでも大歓迎です!

4

1 に答える 1

2

あなたが言うように、の関数SelectionLibが の「メソッド」である場合、 importsContainerは合理的であり、その逆ではないようです。DataLibSelectionLib

その後、ユーザー コードはインポートするだけDataLibです。これには、いくつかのリファクタリングが必要になります。ユーザー コードの混乱を最小限に抑える 1 つの可能性は、既存のDataLibandの名前SelectionLib_DataLibandに変更し、どちらか (または両方) から必要なビットをインポート_SelectionLibする newを用意することです。DataLib

余談ですが、PEP-8 規則に従い、モジュールの名前を lowercase_with_underscores にすることをお勧めします。

于 2013-07-17T10:11:01.120 に答える