README.rstLICENSEsetup.pyrequirements.txtsample/__init__.pysample/core.pysample/helpers.pydocs/conf.pydocs/index.rsttests/test_basic.pytests/test_advanced.pyいくつかの具体的なことを考えてみましょう。interestあなたのモジュールパッケージはリポジトリの中心です。遠ざけてはいけません:./sample/モジュールが1つのファイルのみで構成されている場合、リポジトリのルートに直接置くことができます:./sample.pyあなたのライブラリはあいまいなsrcまたはpythonサブディレクトリに属していません。up.おそらくソースコード自体を除いて、リポジトリの最も重要な部分です。完全なライセンステキストと著作権表示がこのファイルに存在している必要があります。ライセンスなしでコードを公開することも自由ですが、それによりたくさんの人があなたのコードを使用する可能性を阻んでしまうかもしれません。management.あなたのモジュールパッケージがあなたのリポジトリのルートにある場合、これは明らかにルートにあるはずです。リポジトリのルートに置く必要があります。プロジェクトに貢献するために必要な依存関係、つまりドキュメントのテスト、ビルド、および生成を指定する必要があります。介して開発環境を設定したい場合は、このファイルは不要です。documentation.これが他の場所に存在する理由はほとんどありません。tests.まず始めに、小さなテストスイートが1つのファイルに存在することがよくあります:./test_sample.pyテストスイートが成長したら、次のようにテストをディレクトリに移動できます:tests/test_basic.pytests/test_advanced.py明らかに、これらのテストモジュールはパッケージ化されたモジュールをインポートしてテストする必要があります。インストールされることを期待してください。)パス変更を使用します。私は後者を強く勧めます。実行するように要求するためには、コードベースのインスタンスごとに独立した環境設定が必要です。sampleこれは、インストール方法に関係なく、常に期待どおりに動作します。あなた自身のモジュール内でテストを配布すべきだと主張する人もいますが、私は同意しません。多くの場合、ユーザーの複雑さが増します。多くのテストスイートでは、ほとんどが追加の依存関係と実行時コンテキストが必要になります。tasks.ほとんどのプロジェクトやPocooプロジェクトを見てみると、Makefileがあることに気付くでしょう。いうと、これらのプロジェクトはC言語で書かれていません...要するに、makeはプロジェクトの一般的なタスクを定義するために非常に便利なツールであるということです。1.4のリリース以来、Djangoアプリケーションの新しいトレンドに気付きました。多くの開発者は、新しいバンドルされたアプリケーションテンプレートのためにリポジトリを構成していません。samplesite結果のリポジトリ構造は次のようになります:README.rstsamplesite/manage.pysamplesite/samplesite/settings.pysamplesite/samplesite/wsgi.pysamplesite/samplesite/sampleapp/models.pyしかし、このようにしないでください。反復的なパスは、ツールと開発者の両方にとって混乱を招きます。不要なネスティングは誰にも役立ちません(モノリシックなSVNリポジトリを懐かしくしていない限り)。結果の構造:README.rstmanage.pysamplesite/settings.pysamplesite/wsgi.pysamplesite/sampleapp/models.pyコードの構造は重要です¶インポートとモジュールをPythonで処理する方法のおかげで、Pythonプロジェクトを構造化するのは比較的簡単です。これを簡単に言うと、多くの制約がなく、モデルをインポートするモジュールが把握しやすいということです。したがって、プロジェクトのさまざまな部分とその相互作用を作成するという、純粋なアーキテクチャ上の任務が残っています。プロジェクトの簡単な構造化は、それを貧弱にすることも容易であることを意味します。構造の整っていないプロジェクトのいくつかの兆候は次のとおりです。いう質問に答えるためには、循環依存関係があります。この場合、メソッドや関数の中でimportステートメントを使うなど、脆弱なハックに頼らざるを得ません。無関係なテストケースで20回のテストが破られるのは、Carpenterのコードを破るためです。変更を適応させるためには非常に慎重な手術が必要です。Carpenterのコード内のテーブルについての仮定があまりにも多いか、その逆のことです。渡すのではなく、TableとCarpenterは変更可能なグローバル変数に依存しており。矩形テーブルが正方形になった理由を理解するために、これらのグローバル変数へのすべてのアクセスを精査し、リモートテンプレートコードがこのコンテキストを変更してテーブル次元を混乱させていることを発見する必要があります。スパゲッティコード:入れ子にされたif節の複数のページと、多数のコピーペーストされた手続き型コードと適切なセグメンテーションのないループの場合はスパゲッティコードとして知られています。Pythonの意味のあるインデント(最も論争の的になっている機能の1つ)は、この種のコードを維持することを非常に困難にしています。良いニュースはあなたがあまりそれを見ないかもしれないということです。それは、何百もの類似した小さなロジック、しばしばクラスまたはオブジェクトで構成され、適切な構造がありません。FurnitureTable、AssetTableまたはTable、またはTableNewを使用しなければならないことを決して覚えていない場合は、ラビオリコードで泳いでいるかもしれません。モジュール¶Pythonモジュールは、利用可能な主要な抽象レイヤーの1つであり、おそらく最も自然なものです。抽象レイヤでは、コードを関連するデータと機能を保持する部分に分けることができます。プロジェクトのレイヤーはユーザーアクションとのインタフェースを処理でき、別のレイヤーはデータの低レベル操作を処理します。これらの2つの層を分離する最も自然な方法は、1つのファイル内のすべてのインターフェース機能と、別のファイル内のすべての低レベル操作を再グループ化することです。この場合、インターフェイスファイルは低レベルのファイルをインポートする必要があります。文を使うとすぐにモジュールを使います。組み込みモジュール、環境にインストールしたサードパーティモジュール、プロジェクトの内部モジュールのいずれかです。特別な記号は使用しないでください。このように命名すると、Pythonがモジュールを探す方法が妨げられます。