モジュールとパッケージ

PythonBeginner
オンラインで実践に進む

はじめに

この実験では、Python モジュールとパッケージを使ってコードを整理して再利用する方法を学びます。簡単な例から始めて、徐々に複雑な例に進みます。この実験が終わるとき、自分自身のプロジェクトでモジュールとパッケージをどのように使うかを十分に理解しているでしょう。

到達目標

  • Python モジュール
  • Python パッケージ
  • PyPI

Python のモジュールとパッケージとは何か?

Python の モジュール は、関数、クラス、変数の定義を含むファイルです。大きなプログラムを小さくて管理しやすい断片に分割するためにモジュールを使うことができます。モジュールはまた、複数のプロジェクトでコードを再利用しやすくします。

パッケージ はモジュールのコレクションです。パッケージを使うことで、関連するモジュールをまとめてグループ化し、簡単なドット表記を使ってアクセスできます。

Python のモジュールとパッケージにはいくつかのカテゴリがあります。

  1. 組み込みモジュール:これらは Python インタプリタに含まれており、すべての Python プログラムで利用できるモジュールです。組み込みモジュールの例としては、math、os、sys、random などがあります。
  2. 標準ライブラリモジュール:これらは Python 標準ライブラリの一部であり、インタプリタに組み込まれていません。組み込みモジュールと同じ方法でインポートして使用できます。標準ライブラリモジュールの例としては、json、urllib、re、csv などがあります。
  3. サードパーティモジュール:これらは Python コア開発チーム以外の個人または組織によって開発・保守されているモジュールです。組み込みモジュールや標準ライブラリモジュールと同じ方法でインポートして使用できますが、個別にインストールする必要があります。幅広いトピックや目的をカバーする多数のサードパーティモジュールがあります。例としては、numpy、pandas、requests、beautifulsoup4 などがあります。
  4. ローカルモジュール:これらは、使用している Python プログラムと同じディレクトリにあるモジュールです。完全なパスを指定することなく、import 文とモジュール名を使ってローカルモジュールをインポートできます。
  5. 相対インポート:これらは、現在のパッケージまたはモジュールに対する相対的なインポートです。現在のディレクトリとは異なるディレクトリにあるモジュールやパッケージをインポートするために使用できます。同じプロジェクトの一部でありながら、異なるディレクトリ構造に組織化されているモジュールやパッケージをインポートするために相対インポートを使うことができます。

要約すると、Python のモジュールとパッケージは、その由来とアクセス方法に基づいて分類できます。組み込みモジュールと標準ライブラリモジュールは Python インタプリタに含まれており、すべての Python プログラムで利用できますが、サードパーティモジュールは個別にインストールする必要があります。ローカルモジュールと相対インポートを使うことで、同じプロジェクト内でありながら異なるディレクトリ構造にあるモジュールやパッケージをインポートできます。

以下は、Python の組み込みモジュールの 1 つである math モジュールを使う方法の例です。

新しい Python インタプリタセッションを開き、次のコードを入力します。

python3
import math

## 16 の平方根を計算する
x = math.sqrt(16)
print(x)  ## 出力:4.0

## pi のサインを計算する
y = math.sin(math.pi)
print(y)  ## 出力:1.2246467991473532e-16

## 5 の階乗を計算する
z = math.factorial(5)
print(z)  ## 出力:120

math モジュールは、数学関数と定数を提供する Python の組み込みモジュールです。math モジュールで利用できる関数の一部には、sqrt()sin()cos()tan()log()exp()factorial() などがあります。math モジュールはまた、pie などの定数も提供しています。

import 文を使って math モジュールをインポートし、その後コード内でその関数を呼び出して定数にアクセスできます。

上の例では、sqrt() 関数を使って 16 の平方根を計算し、sin() 関数を使って pi のサインを計算し、factorial() 関数を使って 5 の階乗を計算しています。また、sin() 関数の呼び出しで pi の値を表すために pi 定数を使用しています。

他にも、便利な関数と定数を提供する多くの Python の組み込みモジュールがあります。例としては、オペレーティングシステムとのやり取りに使う os モジュール、日付と時刻を扱う datetime モジュール、乱数を生成する random モジュールなどがあります。ドキュメントに Python の組み込みモジュールの完全なリストを見つけることができます。

Python モジュールを作成する

このステップでは、Python モジュールを作成します。モジュールは Python コードを含むファイルです

Python モジュールを作成して使用する方法の簡単な例を以下に示します。

まず、/home/labex/project/ パスに my_module.py という新しいファイルを作成します。これが私たちのモジュールファイルになります。

my_module.py ファイルに、コンソールに挨拶を表示する say_hello() という関数を定義します。

def say_hello():
    print("Hello from my_module!")

ファイルを保存します。

次に、新しい Python ファイルを開く(または Python インタプリタに入る)とともに、import 文を使って my_module モジュールをインポートします。

import my_module

my_module モジュールの say_hello() 関数を使用するには、次のように呼び出します。

my_module.say_hello()  ## 出力:"Hello from my_module!"

これで完了です!私たちは正常に Python モジュールを作成して使用しました。

ImportError 例外

モジュールをインポートするとき、Python は現在のディレクトリと、PYTHONPATH 環境変数にリストされている任意のディレクトリからモジュールファイルを探します。モジュールファイルが見つからない場合、ImportError 例外が発生します。

存在しないモジュールをインポートしてみましょう。

新しいターミナルウィンドウを開き、現在のディレクトリを /home/labex/ に変更します。

cd /home/labex/

次に、新しい Python インタプリタを開き、my_module モジュールをインポートしてみます。

python3
import my_module

ImportError 例外が発生するはずです。

ModuleNotFoundError: No module named'my_module'

PYTHONPATH 環境変数にディレクトリを追加するには、Python ファイルに次の行を追加します。

import sys
## my_module.py は /home/labex/project/ ディレクトリにあります
sys.path.append("/home/labex/project")

import my_module
my_module.say_hello()

sys.path.append() 関数は、import 文の前に呼び出す必要があることに注意してください。

Python パッケージを作成する

このステップでは、Python パッケージを作成します。パッケージは Python モジュールを含むディレクトリです

前のステップの例を拡張しましょう。

まず、/home/labex/project/ パスに my_package という新しいディレクトリを作成します。これが私たちのパッケージディレクトリになります。

/home/labex/project/my_package ディレクトリ内に、__init__.py という新しいファイルを作成します。これは、my_package ディレクトリをパッケージとして扱うべきであることを Python に伝える特別なファイルです。

my_package ディレクトリ内に、my_module.py という新しいファイルを作成します。これが私たちのモジュールファイルになります。

my_module.py ファイルに、コンソールに挨拶を表示する say_hello() という関数を定義します。

def say_hello():
    print("Hello from my_module!")

次に、新しい Python ファイルを開く(または Python インタプリタに入る)とともに、my_package パッケージをインポートします。

import my_package

my_module モジュールの say_hello() 関数を使用するには、次のように呼び出します。

my_package.my_module.say_hello()  ## 出力:"Hello from my_module!"

これで完了です!私たちは正常にモジュール付きの Python パッケージを作成して使用しました。

以下は、私たちのプロジェクトのディレクトリ構造です。

my_package/
├── __init__.py
└── my_module.py

この例は、パッケージを作成してドット表記を使ってそのモジュールにアクセスする方法を示しています。my_package パッケージには my_module モジュールが含まれており、my_package.my_module.say_hello() を呼び出すことで my_module モジュールの say_hello() 関数にアクセスできます。

この文脈では、my_package は Python パッケージであり、my_module は Python モジュールです。パッケージを使うことで、階層構造でコードを整理でき、多くのモジュールが含まれる大規模なプロジェクトに役立ちます。

要約すると、パッケージとモジュールの主な違いは、パッケージはドット表記を使ってアクセスできるモジュールのコレクションであり、モジュールは関数、クラス、変数の定義を含む独立したファイルであるということです。

サードパーティパッケージ

Python のサードパーティパッケージは、Python コア開発チーム以外の個人または組織によって開発・保守されているパッケージです。組み込みモジュールや標準ライブラリモジュールと同じ方法でインポートして使用できますが、個別にインストールする必要があります。

Python 用のサードパーティパッケージは数多くあり、幅広いトピックや目的をカバーしています。例としては、科学的計算用の numpy、データ分析用の pandas、HTTP リクエストを扱うための requests、ウェブスクレイピング用の beautifulsoup4 などがあります。

Python が非常に人気がある最も重要な理由は、サードパーティパッケージが豊富であることです。

サードパーティパッケージをインストールするには、デフォルトで Python に含まれている pip パッケージマネージャを使用できます。たとえば、requests パッケージをインストールするには、次のコマンドを実行します。

pip install requests

また、conda などの他のパッケージマネージャを使ってサードパーティパッケージをインストールすることもできます。詳細は Anaconda を参照してください。

パッケージをインストールしたら、Python コードでインポートして使用できます。たとえば、requests パッケージを使って HTTP リクエストを送信し、レスポンスを表示する方法は次のとおりです。

python3
import requests

response = requests.get("https://www.example.com")
print(response.text)

このコードは、requests パッケージを使って URL https://www.example.com に HTTP GET リクエストを送信し、その後コンソールにレスポンステキストを表示します。

requests.get() 関数は指定された URL に HTTP GET リクエストを送信し、レスポンスデータを含む HTTPResponse オブジェクトを返します。レスポンスオブジェクトには、レスポンスデータにアクセスして操作するためのさまざまな属性とメソッドがあります。

この場合、response.text 属性には文字列としてのレスポンスボディが含まれています。print(response.text) を呼び出すことで、レスポンスボディをコンソールに表示しています。

Python のサードパーティパッケージは、Python エコシステムの重要な一部であり、一般的なタスクに対する既製のソリューションを提供し、Python の機能を拡張します。サードパーティパッケージを使うことで、プロジェクトで何も作らずに使える事前に構築されたソリューションがあるため、時間と労力を節約できます。

サードパーティパッケージを使うことで節約できる時間と労力に加え、より信頼性の高く保守しやすいコードを書くこともできます。十分にテストされ、広く使われているパッケージを使うことで、他の人の作業を利用して、自分たちの特定の問題を解決に集中できます。

全体的に、Python のサードパーティパッケージは、Python の機能を拡張し、一般的なタスクを解決するための重要なリソースです。時間と労力を節約し、他のツールやライブラリとの統合を支援し、コードの信頼性と保守性に貢献します。

まとめ

この実験では、Python のモジュールとパッケージを使ってコードを整理して再利用する方法を学びました。プログラムでモジュールとパッケージをインポートして使用する方法を見て、また独自のパッケージを作成する方法も学びました。モジュールとパッケージを使うことで、クリーンで保守しやすいコードを書くことができます。