1. 説明
Python は、データ分析から Web 開発まであらゆる用途に使用される多用途で広く採用されているプログラミング言語です。ただし、Python プロジェクトが複雑になるにつれて、すべての移動部分を追跡し、すべてが整理されていることを確認することが困難になる場合があります。
ここで、Python ファイル構造を理解することが役立ちます。この記事では、Python プロジェクトを構築するためのいくつかの重要な概念と、それらを最適に適用する方法を確認します。
始めたばかりの場合、これらのベスト プラクティスは、より良いコードを作成するのに役立つだけでなく、Python コードベースやデータ パイプラインをより適切に維持および拡張するのにも役立ちます。
目次
- なぜプロジェクトを分割するのでしょうか?
- Python プロジェクトを構築するための 9 つのベスト プラクティス
- デモ: 単純なデータ エンジニアリング プロジェクト
- 簡単にコラボレーションできるプロジェクトを構築する
- Python プロジェクトのフォルダー構造とキー ファイル
2. プロジェクトを分割する理由は何ですか?
Python プログラムが大きくなるにつれて、ますます管理できなくなります。これは、チームがプロジェクトで協力しており、プロジェクトの複数の側面を同時に変更している場合に特に当てはまります。
プロジェクトの管理と保守を容易にするために、大規模で扱いにくいプログラミング タスクを、より管理しやすいサブタスクまたはモジュールに分割します。名前が示すように、モジュールは複数の場所で再利用できます。
プロジェクトをモジュールに分割することを「モジュール プログラミング」と呼びます。前回の記事で述べたように、関数、モジュール、パッケージはモジュール型プログラミングで使用されるメカニズムです。モジュール式プログラミングには多くの利点があります。
- これにより、一度に 1 つのモジュールに集中して作業を効率化できます。
- これにより、プロジェクトの保守が容易になります。 チームが一緒にプロジェクトに取り組んでいる場合、モジュール方式のアプローチを採用すると、作業結果がバージョンの競合になる可能性が低くなります。
- これにより、コードがより再利用可能になります。 プロジェクトが大規模なモノリスの場合、プロジェクトを再利用したい場合は、大量のコードを解析する必要があります。コードがモジュールに編成されている場合、必要な部分だけをインポートするのが簡単になります。
- 重複が減ります。 上記の点に従うと、モジュラー コードは再利用可能です。つまり、関数が重複する可能性が低くなります。
- 各モジュールは個別の名前空間を定義できるため、名前空間の競合を回避するのに役立ちます。
3. Python プロジェクトを構築するための 9 つのベスト プラクティス
Python コードを整理して記述する方法についてのアドバイスをオンラインで検索すると、さまざまなアイデアがたくさん見つかります。しかし、実際には、いくつかの基本的なことが重要になります。
3.1. 組織コード
プロジェクトに取り組むときは、コードを正しく整理することが重要です。まず、コード自体用、データ用、テスト用、ドキュメント用など、プロジェクトのさまざまな部分に個別のフォルダーを作成できます。これにより、必要なものをより早く見つけられ、他の人がコードを参照しやすくなります。
3.2. 一貫した命名を使用する
プロジェクト全体でファイルとフォルダーに一貫した名前を使用することが重要です。変数や関数にはアンダースコアを使用し、クラスには大文字を使用するなどの規則に従うようにしてください。これにより、コードが読みやすく、理解しやすくなります。
3.3. バージョン管理の使用
単独で作業する場合でも、Git などのツールを使用してコードの変更を追跡することをお勧めします。これにより、変更を記録し、作業内容をクラウドベースのリポジトリに簡単にバックアップできます。ほとんどのクラウドベースの Git ソリューションは、個人の実践者向けに無料枠を提供しています。
3.4. パッケージマネージャーの使用
pip などのパッケージ マネージャーを使用して依存関係を管理すると、プロジェクトで実行する必要があるさまざまなソフトウェアをすべてインストールして追跡するのに役立ちます。これは、多くの依存関係がある大規模なプロジェクトに取り組んでいる場合に特に重要です。
3.5. 仮想環境の作成
コンピュータ上の他のプロジェクトからプロジェクトを分離するには、仮想環境を使用できます。これにより、異なるプロジェクトで使用されるパッケージ間の競合が防止されます。
3.6. コードのコメント化
コードの動作とその使用方法を説明するコメントを追加することは、コードを他の人がアクセスしやすくするために重要です。また、コードを書いたときに何を考えていたかを思い出すのにも役立ちます。
3.7.テスト
自動テストを使用してコードが期待どおりに動作することを確認することは、エラーを早期に発見するために重要です。これにより時間を節約し、問題を防ぐことができます。
3.8. ラフとスタイル
Ruff や Flake8 などのツール を使用して、 コードの一貫性を確保し、一般的なエラーをキャッチすると、より良いコードを作成するのに役立ちます。これらのツールは、コードが公式 Python スタイル ガイド PEP 8 と一致しているかどうかをチェックします。Blackなどのツールを使用して 、プロジェクト全体でコードが同じに見えるようにすることもできます 。これにより、一貫性が維持され、コードが読みやすく、理解しやすくなります。
3.9. パッケージ化と共有
setuptools などのツールを 使用してPython コードをパッケージ化して配布すると、他のユーザーと作業を簡単に共有できるようになります。これは、他の人が問題を起こすことなくコードを使用できるようにするのにも役立ちます。
4. デモンストレーション: 単純なデータ エンジニアリング プロジェクト
これらのヒントを実際の例に適用してみましょう。整理されたコード、一貫した命名、役立つコメント、テストなど、いくつかのベスト プラクティスを使用します。
データベースからデータを抽出し、変換して、別のデータベースにロードするスクリプトを作成します。まず、my_module.py というモジュールで変数と関数を定義しましょう。
# Constants
SOURCE_DB = "source_db"
DESTINATION_DB = "destination_db"
TABLE_NAME = "table_name"
DATE_COLUMN = "date_column"
SALES_COLUMN = "sales_column"
# Functions
def extract_data(table_name):
# Code to extract data from the source database
def transform_data(data_frame):
# Code to transform the data
def load_data(data_frame):
# Code to load the data into the destination database
この例では、変数と関数に一貫した名前を使用します。、 、 などの定数は大文字で表記され、アンダースコアで区切られます。や などの関数はすべて小文字であり、アンダースコアで区切られています。SOURCE_DB
DESTINATION_DB
TABLE_NAME
DATE_COLUMN
SALES_COLUMN
extract_data
transform_data
load_data
次に、ファイルに簡単な単体テストを記述して、コードが希望どおりに動作することを確認しましょう。test.py
import unittest
import pandas as pd
from my_module import transform_data
class TestDataTransformation(unittest.TestCase):
def test_transform_data(self):
# Create a sample input DataFrame
input_data = pd.DataFrame({
"date_column": ["2022-01-01", "2022-02-01", "2022-03-01"],
"sales_column": [100, 200, 300]
})
# Call the transform_data function
output_data = transform_data(input_data)
# Check the output DataFrame
expected_output = pd.DataFrame({
"year": [2022, 2022, 2022],
"month": [1, 2, 3],
"sales": [100, 200, 300]
})
pd.testing.assert_frame_equal(output_data, expected_output)
ここでは、モジュールとモジュールをインポートし、からunittest
pandas
transform_data
my_module.py.
次に、 を継承する というテスト クラスを定義します。このクラス内で、 という単一のテスト関数を定義します。この関数は、3 行のデータを含むサンプル入力データ フレームを作成し、この入力データを使用して関数を呼び出し、出力データ フレームをチェックして期待値が含まれていることを確認します。TestDataTransformation
unittest.TestCase
test_transform_data
transform_data
同じ 3 行のデータを使用して予想される出力データ フレームを定義し、この関数を使用して出力データ フレームが予想されるデータ フレームと一致するかどうかを確認します。出力データ フレームが予期されたデータ フレームと一致する場合、テストは成功します。それ以外の場合、テストは失敗し、不一致が発生した場所に関する情報が返されます。pd.testing.assert_frame_equal
5. コラボレーションを促進するプロジェクトを構築する
他の開発者とコードを書くときに考慮すべき最も重要な点は次のとおりです。
- コードのバージョンが正しいことを確認してください。
- ソフトウェアの依存関係を修正します。
ここでバージョン管理が役に立ちます。開発チームが Web アプリケーションの開発を含む Python プロジェクトに取り組んでいるとします。各開発者は、プロジェクトの特定の機能またはモジュールに取り組みます。バージョン管理がなければ、チームは作業を手動で調整する必要があり、これは気が遠くなり、エラーが発生しやすくなります。ある開発者が別の開発者の作業を誤って上書きして、進行状況が失われたり競合したりする可能性があります。
ただし、Git のようなバージョン管理システムを使用すると、チームは簡単に変更を追跡し、コードで共同作業し、全員が同じバージョンのコード ベースで作業していることを確認できます。Git を使用すると、各開発者は独自のブランチで作業できるため、メインのコード ベースに影響を与えることなく、独立して変更を加えることができます。
全員の変更を統合する段階になったとき、Git はコードをマージして競合を解決するためのツールを提供するため、チームの共同作業が容易になります。Git は、各開発者によって行われたすべての変更を含むコード ベースの完全な履歴も提供します。これは、デバッグやコードが時間の経過とともにどのように進化するかを理解するのに役立ちます。
共有コードへの変更によって他のプロジェクトが中断されないようにするには、 pytest などの自動テスト ツールを 使用するのが最善です 。また、コードの変更をメインのコード ベースにマージする前にレビューすることもお勧めします。
最後に、ベスト プラクティスのリストで述べたように、「簡単なコラボレーション」に関しては、コードを作成するときにコードを文書化することが重要です。これにより、新しいチーム メンバーがコードを理解し、すぐに理解できるようになります。
6. Python プロジェクトのフォルダー構造とキー ファイル
なぜ Python プロジェクトに構造があるのか疑問に思われるかもしれませんが、このプロジェクトを整理する方法は、すべてを整理整頓するのに役立つため、Python では一般的です。最上位のフォルダーは「my-project」と呼ばれ、プロジェクト全体のメイン フォルダーのようなものです。項目の 2 つのレベルを区別するには、ダッシュと下線を使用します。特に、アンダースコアは、ダッシュ表記を使用する可能性のある変数名や関数名とプロジェクト参照を区別するのに役立ちます。ダッシュはマイナス記号でもあるため、Python パッケージの「内部レベル」を定義するにはアンダースコアを使用する必要があります。my-project/my_project
マイ プロジェクトでファイルをどのように整理するかについては、大まかな仕様があります。通常、最上位にはファイルとさまざまな構成ファイルが含まれます。プロジェクトの最も重要な部分は、プロジェクトに含まれる Python パッケージです。Python パッケージは、Python インポート システムの有効なターゲットを形成するディレクトリであり、通常はファイルが含まれています。この例では、最上位に「my_project」という名前の Python パッケージがあります。README.md
__init__.py
ここからは、ほとんどのプロジェクトに含まれる主要なファイルとサブフォルダーは次のとおりです。
- 依存関係管理ファイル (通常は または ) このファイルは、プロジェクトとその依存関係を構成するために使用されます。このブログ シリーズのパート 2 では、依存関係の管理について説明しました。
setup.py
pyproject.toml
README.md
: このファイルはマークダウンで書かれており、プロジェクト、その目的、インストールまたは使用方法について簡単に説明しています。LICENSE
: このプレーン テキスト ファイルは、コードが配布されるライセンスを指定します。オープンソース ライセンスは数多くあるため、ニーズに合ったものを選択してください。
さらに、多くのプロジェクトには次の 2 つのフォルダーがあります。
src/
: このディレクトリは、Python パッケージをプロジェクト ルートに直接配置したくない場合の代替の場所です。tests/
: このディレクトリには、プロジェクトの機能を検証するテスト コードが含まれています。pytest や Unittest などのテスト フレームワークを使用して、テストを作成および実行できます 。
次...
特にチームの一員である場合、または他の開発者と作業を共有する予定がある場合、プロジェクトの複雑さが増すにつれて、Python プロジェクトを構造化された方法で整理することの重要性を共有しました。この記事で概説されているベスト プラクティスに従うことで、基本コードやデータ パイプラインの保守と拡張が容易になります。