web-dev-qa-db-ja.com

モジュールとパッケージを整理するPythonの方法

私は通常、クラスごとに1つのファイルを作成するバックグラウンドから来ています。共通のクラスもディレクトリの下に整理しています。この方法は私には直感的であり、C++、PHP、JavaSriptなどで効果的であることが証明されています。

このメタファーをPythonに取り込むのに問題があります。ファイルはもはや単なるファイルではなく、正式なモジュールです。モジュールに1つのクラスを含めるのは正しくないようです---ほとんどのクラスはそれ自体では役に立たないです。 automobile.pyクラスとAutomobileクラスがある場合、それを常にautomobile.Automobileとして参照するのはばかげているようです。

しかし同時に、大量のコードを1つのファイルに入れて、それを1日と呼ぶのは正しくないようです。明らかに、非常に複雑なアプリケーションには5つ以上のファイルが必要です。

正しい---またはPythonic ---方法は何ですか? (または、正しい方法がない場合、どのような方法とその理由をお勧めしますか?)Pythonモジュールにどのくらいのコードをスローする必要がありますか?

43
carl

「パッケージングの論理単位」の観点から考えてください。これは単一のクラスである場合もありますが、多くの場合、密接に連携するクラスのセットになります。クラス(またはモジュールレベルの関数-モジュールレベルの関数も選択肢として利用できる場合は、常に静的メソッドを使用して「do Java in Python」を実行しないでください!-)」をベースにグループ化できます。基本的に、AのほとんどのユーザーがBも必要とし、その逆の場合、AとBはおそらく同じモジュールに含まれている必要がありますが、多くのユーザーが一方のみを必要とし、他方を必要としない場合は、おそらく個別のモジュール(おそらく同じパッケージ内、つまり__init__.pyファイルを含むディレクトリ)。

標準のPythonライブラリは、完璧にはほど遠いものの、(ほとんど)合理的に優れたプラクティスを反映する傾向があるため、例を挙げて学ぶことができます。たとえば、threadingモジュールもちろん、Threadクラスを定義します...しかし、ロック、イベント、条件、セマフォなどの同期プリミティブクラスと、スレッド操作によって発生する可能性のある例外クラス(およびいくつかのクラス)も保持します。それは妥当なサイズ(空白とdocstringを含む800行)の上限であり、Queueなどのいくつかの重要なスレッド関連機能は別のモジュールに配置されていますが、それでも機能の最大量の良い例ですそれでも、単一のモジュールにパックすることは理にかなっています。

35
Alex Martelli

ファイルごとに1つのクラスのシステムに固執したい場合(論理的ですが、誤解しないでください)、automobile.Automobileを参照する必要がないように次のようなことを行うことができます。

from automobile import Automobile
car = Automobile()

ただし、cobbalが述べているように、Pythonではファイルごとに複数のクラスがかなり一般的です。いずれにせよ、あなたが賢明なシステムを選び、それを一貫して使用する限り、私はPythonユーザーがあなたに腹を立てるだろうとは思わない:)。

9
Conrad Meyer

C++の観点から来ている場合は、.soまたは.dllに似たpythonモジュールを表示できます。 pythonがスクリプト化されているため、ソースファイルのように見えますが、実際には特定の機能のロード可能なライブラリです。

役立つかもしれない別のメタファーは、pythonモジュールを名前空間として見るかもしれないということです。

8
mtvee

中規模のプロジェクトでは、密接に関連するクラスのセットがいくつかあることに気づきました。これらのセットのいくつかは、ファイルにグループ化されています。たとえば、低レベルのネットワーククラスはすべて単一のnetworkモジュールにあります。ただし、最大のクラスのいくつかは独自のファイルに分割されています。

おそらく、ファイルごとに1つのクラスの履歴からそのパスを開始する最良の方法は、通常は同じディレクトリに配置するクラスを取得し、代わりにそれらを同じファイルに保持することです。そのファイルが大きくなりすぎた場合は、分割します。

4
eswald

漠然としたガイドラインとして:ファイルごとに複数のクラスがPythonの標準です

また、 1つのファイルにいくつのPythonクラスを入れる必要がありますか?

3
cobbal