[Python プログラミング] プロジェクトのベスト プラクティス [03/8]

1. 説明

        コラボレーションと生産性を高めるためにプロジェクトを構築するのに役立つ 9 つのベスト プラクティスと例を取り上げました。 次の記事は、データ エンジニアリングのための Python シリーズの一部であり、データ エンジニア、データ サイエンティスト、データ アナリスト、機械学習エンジニア、または Python を初めて使用する人が基本をマスターできるように設計されています。これまでのところ、この初心者向けガイドには次の内容が含まれています。

        Python は、データ分析から Web 開発まであらゆる用途に使用される多用途で広く採用されているプログラミング言語です。ただし、Python プロジェクトが複雑になるにつれて、すべての移動部分を追跡し、すべてが整理されていることを確認することが困難になる場合があります。

        ここで、Python ファイル構造を理解することが役立ちます。この記事では、Python プロジェクトを構築するためのいくつかの重要な概念と、それらを最適に適用する方法を確認します。

        始めたばかりの場合、これらのベスト プラクティスは、より良いコードを作成するのに役立つだけでなく、Python コードベースやデータ パイプラインをより適切に維持および拡張するのにも役立ちます。

目次


2. プロジェクトを分割する理由は何ですか?

        Python プログラムが大きくなるにつれて、ますます管理できなくなります。これは、チームがプロジェクトで協力しており、プロジェクトの複数の側面を同時に変更している場合に特に当てはまります。

        プロジェクトの管理と保守を容易にするために、大規模で扱いにくいプログラミング タスクを、より管理しやすいサブタスクまたはモジュールに分割します。名前が示すように、モジュールは複数の場所で再利用できます。

        プロジェクトをモジュールに分割することを「モジュール プログラミング」と呼びます。前回の記事で述べたように、関数、モジュール、パッケージはモジュール型プログラミングで使用されるメカニズムです。モジュール式プログラミングには多くの利点があります。

  1. これにより、一度に 1 つのモジュールに集中して作業を効率化できます。
  2. これにより、プロジェクトの保守が容易になります。 チームが一緒にプロジェクトに取り組んでいる場合、モジュール方式のアプローチを採用すると、作業結果がバージョンの競合になる可能性が低くなります。
  3. これにより、コードがより再利用可能になります。 プロジェクトが大規模なモノリスの場合、プロジェクトを再利用したい場合は、大量のコードを解析する必要があります。コードがモジュールに編成されている場合、必要な部分だけをインポートするのが簡単になります。
  4. 重複が減ります。 上記の点に従うと、モジュラー コードは再利用可能です。つまり、関数が重複する可能性が低くなります。
  5. 各モジュールは個別の名前空間を定義できるため、名前空間の競合を回避するのに役立ちます。

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_DBDESTINATION_DBTABLE_NAMEDATE_COLUMNSALES_COLUMNextract_datatransform_dataload_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)

        ここでは、モジュールとモジュールをインポートし、からunittestpandastransform_datamy_module.py.

        次に、 を継承する というテスト クラスを定義します。このクラス内で、 という単一のテスト関数を定義します。この関数は、3 行のデータを含むサンプル入力データ フレームを作成し、この入力データを使用して関数を呼び出し、出力データ フレームをチェックして期待値が含まれていることを確認します。TestDataTransformationunittest.TestCasetest_transform_datatransform_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.pypyproject.toml
  • README.md: このファイルはマークダウンで書かれており、プロジェクト、その目的、インストールまたは使用方法について簡単に説明しています。
  • LICENSE: このプレーン テキスト ファイルは、コードが配布されるライセンスを指定します。オープンソース ライセンスは数多くあるため、ニーズに合ったものを選択してください。

さらに、多くのプロジェクトには次の 2 つのフォルダーがあります。

  • src/: このディレクトリは、Python パッケージをプロジェクト ルートに直接配置したくない場合の代替の場所です。
  • tests/: このディレクトリには、プロジェクトの機能を検証するテスト コードが含まれています。pytest や Unittest などのテスト フレームワークを使用して、テストを作成および実行できます 。

次...

        特にチームの一員である場合、または他の開発者と作業を共有する予定がある場合、プロジェクトの複雑さが増すにつれて、Python プロジェクトを構造化された方法で整理することの重要性を共有しました。この記事で概説されているベスト プラクティスに従うことで、基本コードやデータ パイプラインの保守と拡張が容易になります。

おすすめ

転載: blog.csdn.net/gongdiwudu/article/details/132758540
おすすめ