Pythonのimport
文はfrom
で始まったりimport
で始まったりする。ややこしい。そのパターンや記述する位置など、基本的な使い方を整理してみたい。
import文とは
import
文とは、あるソースファイルの中に、他のソースファイルの中身を持ってくるための宣言文である。
このソースファイルは、自前のものでも良いし、既存のライブラリのものでも良い。また、モジュール全体をそのまま持ってくることもできるし、特定の変数や関数、クラスだけをインポートすることもできる。
モジュールという言葉が何を指すか、慣れないうちは混乱するかもしれない。import
文と関連の深い、いくつかの用語を最初に整理しておく。
用語 | 意味 |
---|---|
モジュール | .py 拡張子を持つ1つのファイル。 |
パッケージ | 複数のモジュールを含むディレクトリ。少なくとも1つの__init__.py を持つ。 |
ライブラリ | 特定の目的のために用意された、1つ以上のモジュールやパッケージの集合。 |
名前空間 | 変数名、関数名、クラス名などの衝突を避けるために、インポート先で使われる識別子。 |
基本的な使い方
Pythonのimport
文は、技術的にはファイルのどこにでも書ける。ただし、可読性や一貫性の観点から先頭に書くことが慣習となっている。
このモジュール名は、インポートしたいファイル名(xxx.py
のxxx
の部分)である。これがそのまま名前空間となる。
つまりxxx.変数名
、xxx.関数名()
のような形で、そのモジュール内で定義されたアレコレを使える。
また、名前空間を任意に指定したいときは、as
キーワードを使って以下のように書く。
もし存在しないモジュールをインポートしようとすると、実行時にModuleNotFoundError: No module named 'モジュール'
のようなエラーが出て処理が止まる。
書き方のパターン
Pythonのimport文の書き方には、いくつかパターンがある。
例えば複数のモジュールをインポートする場合は、モジュール名をカンマ区切りで追加することもできる。
as
キーワードをつける場合は、そのままモジュール名の後ろに追加すれば良い。
この、複数のモジュールをカンマ区切りで書くインポートは、見ての通り長くなる。そのため1つ1つ改行してインポートする方法が推奨される。Pythonのコードフォーマッターも、カンマ区切りで書かれたインポートは強制的に分割する。
また、モジュール内の特定の変数、関数、クラス名のみをインポートしたい時は、以下のように書く。
識別名は、変数名や関数名、クラス名である。この書き方の場合、複数の識別名をカンマ区切りでつなげても良い。
なお、JavaScriptのexport
のように、元ファイル側で特別なキーワードを指定する必要はない。Pythonのモジュールは、デフォルトですべての変数、関数、クラスをエクスポート(別のファイルからインポート)できる。
モジュールの検索方法
なんの断りもなくimport モジュール名 as 任意の名前
とサンプルを書いてきたが、正確にはモジュール名
の箇所はモジュールのパス
である。
単にモジュール名
を指定した場合、Pythonのインポートシステムはまずスクリプトが実行されているディレクトリから該当するモジュールを探す。そこで見つからなければ標準ライブラリを探し、それでも見つからなければサードパーティのライブラリを探す。
最終的に見つからなければModuleNotFoundError
となる。
ちなみにこの読み込み順は、sys.path
という変数で確認できる。
絶対インポートと相対インポート
無印でモジュール名を指定した場合、現在のディレクトリ、標準ライブラリ、サードパーティのライブラリと順に検索される。これはsys.pathに記載されたパスの代替、つまり変則的な絶対パス指定である。
現在のディレクトリより深い位置にあるモジュールをインポートしたい場合は、以下のように.
を使って書く。
パッケージ名はディレクトリ名、モジュール名はファイル名と同義である。
また、パッケージの中にサブパッケージがあり、この中でインポート文を使いたい場合、頭に’.’をつけるとその位置からの相対パスを指定できる。この場合、from
を使った形でインポートしたい変数、関数、クラスを指定する必要がある。
相対インポートは、そのファイルがメインプログラムとして実行されないことが前提となっている。相対インポートを使ったファイルを直接実行するとImportError
が出る。
……などともっともらしく書いたが、Pythonのパッケージ周りをまだあんまり理解していないので、この辺りの情報には間違いがあるかもしれない。
PEP 8が推奨するインポート文の書き方
Pythonには、コミュニティで標準化されているガイドラインがある。このガイドラインは、Python Enhancement Proposals、略してPEPsと呼ばれる。PEPsはナンバリングで管理されており、PythonのスタイルガイドはPEP 8にまとめられている。
PEP 8には、インポート文の項目もある。
PEP 8曰く、
import x,y
のようにカンマで繋げるべからず。1つずつ改行してインポートせよ。- ただし
from x import y, z
みたいな形は許すぞよ。 - インポート文は常にファイルの最上部へ配置せよ。
- インポートは、標準、サードパーティ、自前の順にせよ。そして各グループを空白で区切れ。
- パッケージレイアウトが複雑な場合を除き、なるべく絶対インポートを使え。
- ワイルドカードインポート(
from モジュール名 import *
)は避けよ。名前衝突の危険あり。
だそうである。別に守らなくても死なないが、弁えてはおきたいところだ。
importできないとき
Pythonでは、ディレクトリ名と同一のファイル名からは諸々をインポートできない。正しく`import`文を書いているにもかかわらず、インポートできない場合は、この点をまずチェックすることを勧める。