はじめに
本業がプログラマじゃないけどPythonをたまに使う自分向けのメモです。PythonでFromとimportをおまじないとして使ってたり、モジュール/パッケージ/ライブラリの整理が少し経つと忘れてしまう人向けのメモです。自作ライブラリやサブフォルダとか作りたくなってきた人はちゃんと理解しましょう。
ソースコード区分の概念
モジュール
モジュールは、Pythonプログラムの1つのファイル(xxx.py)です。
モジュールは、関数、クラス、変数などのコード要素を定義することができます。
他のPythonプログラムからimport文を使用してモジュールを読み込み、そのコード要素を使用することができます。
モジュールは再利用可能なコードの1つの最小単位となります。ある機能の実装を1つのモジュールにまとめておくことで、他のプログラムで簡単に利用できるようになります。
パッケージ
パッケージは、Pythonプログラムの複数のモジュールをまとめたものです。
パッケージは、ディレクトリとその中に含まれるモジュールファイル群(=ディレクトリ+その配下の.pyファイル、その他設定ファイルなど)から構成されます。
またパッケージには、__init__.pyという名前の特別なファイルを含めます。このファイルには、パッケージの初期化コードなどが含まれます。
他のPythonプログラムからimport文を使用してパッケージを読み込むことができます。
もう一歩踏み込むと、パッケージは「ドット付きモジュール名」を使用して Python のモジュール名前空間を構造化する方法とのことです。例えばいろんなパッケージフォルダごとに別々のcommon.pyのようなモジュールファイルが多数あったとしても、import <パッケージの名前>.commonとすることで一意にモジュールを識別することができます。
ライブラリ
ライブラリは、複数の関数、クラス、モジュールやパッケージの集まりです。
ライブラリは、特定の目的を持つコードの集合体であり、一般に汎用的に再利用可能なコードの塊です。ライブラリをインストールすることで一般的なタスクを実行するための関連する一連の関数やクラスを提供します。例えば、mathライブラリは数学的な演算を行う関数を提供します。
また主要なライブラリは、Pythonの標準ライブラリやサードパーティのライブラリとして提供されることがあります。
例えばpip install matplotlibのようにすることで公開されているライブラリをインストールし、コード上でimport matplotlibすることで数学的なプロットをするモジュールを使えるようになります。
つまり?
簡単に言えば、モジュールは1つのファイル、パッケージはモジュールをまとめたもの(ディレクトリ)、ライブラリは再利用可能なコードの集まりという関係です。パッケージは主に複数のモジュールを整理するために使用され、ライブラリは特定の目的を持つコードのコレクションです。
importとFromの区分
import
importはimport対象のモジュールの中身全てを取り込みます。対象がライブラリならライブラリ全体を取り込みます。例えば、import datetimeとすると、datetimeライブラリのすべての機能を利用でき、各種モジュールの機能やクラスにアクセスできます。
しかし、使用時はライブラリ名の後にドットを使って関数やクラスなどを指定する必要があります。日付や時刻を表すオブジェクトを作るときは、datetime.dateやdatetime.timeというように書かなければなりません。
from
fromは、特定のモジュール、クラス、または関数をインポートするための方法です。
fromを使用すると、importした要素をライブラリ名を指定せずに直接使用できます。例えば、from datetime import date, timeとすると、dateやtimeというオブジェクトを作るときに、モジュール名を書かなくても済みます。
つまり?
importとfromの違いは、モジュールの全体か一部かを利用するかという点です。importはモジュール全体を利用できますが、モジュール名を付けなければならないことが多くなります。fromはモジュールの一部だけを利用できますが、モジュール名を省略できることが多くなります。どちらを使うかは、目的や好みによって異なります。
- モジュール内のほとんどの機能を使う場合はimportを使う
- モジュール内の一部の機能しか使わない場合はfromを使う
- モジュール内に同じ名前の機能がある場合はimportを使って区別する
- モジュール名が長すぎる場合はimport asを使ってエイリアス(別名)を付ける
fromやimportの使い方の例
# モジュールのインポート
import module_name
# モジュール内の特定の要素のみをインポート
from module_name import function_name
# パッケージのインポート
import package_name
# パッケージ内の特定の要素のみをインポート
from package_name import module_name
# パッケージ内の特定のモジュールから特定の要素をインポート
from package_name.module_name import function_name
ライブラリから * を import
from math import * みたいな書き方も見ます。ワイルドカードを使ったimportは非推奨のコードです。mathライブラリのあらゆるモジュールを取り込むという意味ですが、未知のコードを読み込んだり、定義済みの名前を上書き・コンフリクトしてしまう可能性があるからです。
終わりに
Qiitaとか技術ブログもいいけど、まずはPythonのドキュメンテーションを検索してちゃんと読むのも大事ですね。
もうちょっと図や表を使って整理したりimportパターンを網羅したいですがそれはまた今度。