2017-07-01 15 views
0

私はPythonのプログラム(Pycharmを使っている)で作業しています。Pycharmのコードの約半分がクラスと関数によって占められています。プログラムはかなり長くなり、1つのファイルに書き込まれます。 クラス、関数、およびその他のコードを3つの別々のファイルに分けることができれば、多くの時間が節約されます。現時点では、 "from FunctionDocument import *"というステートメントがメイン文書に書かれていると動作しないような循環インポートのために、私はそれを行うことができません。複数のファイルを1つのスクリプトとして扱う簡単な方法はありますか?

私は循環輸入が専門家ではなく、推奨されていないことを認識しています。しかし、3つの別々のファイルをすべて1つのファイルとして扱うように指示する1行または2行を単に追加するのはなぜ不可能なのでしょうか?

これは、コードを書き直して非円形にすることで解決できることがわかっています。また、Viritual Environmentを作成すると問題が解決する可能性があります。しかし、本当に他の方法はありませんか?

+0

なぜ循環輸入が唯一の方法だと思いますか? –

+0

[この他の質問](https://stackoverflow.com/a/40094439/3896566)の回答を見ましたか?これは "python circular import"を検索した最初の結果の1つであり、循環輸入の有無にかかわらずさまざまな意見を含んでいます。 (まあ、それほど正確ではありませんが、それほど重要ではありません)。私がリンクした具体的な答えはあなたの状況に役立つかもしれない循環輸入の流れの一部を説明しています。 – RemedialBear

+0

ファイルを実行する前にファイルを貼り付けるユーティリティを書くことができます... Pythonが独自にこれを行うことができるのであれば、私も興味があります – karlosss

答えて

1

循環参照がある場合、おそらくソリューションの設計に根本的な問題があります。私の推奨は、あなたのデザインをモジュール化することです。

任意の数のファイル(たとえば3)でコードを分割するのではなく、モジュールフォルダを作成するために、各モジュールを初期化するためにファイルを分割し、各クラスごとにファイルを分割してください。最初は、小さなファイルをたくさん持っているのは面倒なように思えるかもしれませんが、あなたはすぐにアプローチがどれほどメンテナンス可能かをすぐに見ていきます。

循環依存関係を排除すると、クラス間の依存関係に問題が生じることがあります。クラスはお互いに依存すべきではありません。依存関係は一方向でなければなりません。例えば、Dogはそれを拡張してAnimalに依存するかもしれません。しかし、動物はDogクラスを参照することはできません。これは、それがそれと協調することができないということを意味するものではありません。たとえば、Dogクラスで定義されているメソッドを使用します。

クラス間の依存関係を減らすための主なツールの1つはduck typingです。メソッドを使用するためにクラスをインポートする必要はありません。オブジェクトがメソッドの引数として渡された場合、クラスを知らなくてもそのオブジェクトにメッセージを送信できます。

Thisは、Pythonプロジェクトを構成する良い記事です。このアプローチに従えば、コードの明確さと生産性の向上をすばやく見つけることができます。

+0

[X-Y問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)の可能性が高いことに対する助言。 [here](http://mywiki.wooledge.org/XyProblem)も説明します。 – martineau

関連する問題