Pythonのimport文のわかりやすい使い方

283, 2021-07-05

目次

Pythonのimport文のわかりやすい使い方

Pythonでは他のモジュールやパッケージをimport文を使ってインポートすることができます。
import文を覚えてモジュールを分割すれば大規模な開発に対応することが可能です。

結論から言うとimport文は↓のように使います。

# オーソドックスなモジュールのインポート
import mod

# パッケージ以下のモジュールをインポート
import animals.cat

# インポートしたモジュールに別名をつける
import mod as mymod

# fromでパッケージからモジュールをインポート
from animals import cat

# fromで複数のモジュールをインポート
from animals import cat, dog
from animals import (
    cat,
    dog,
)

# fromでモジュール内の関数をインポート
from mod import (
    func1,
    func2,
)

この記事ではimport文について具体的に↓を見ていきます。

  • 解説の前提とするディレクトリ構造

  • パッケージ、モジュールとは?

  • パッケージ、モジュールのインポートとは?

  • import文の構造

  • importでパッケージ、モジュールをインポート

  • fromを使ったインポート

  • インポートしたモジュールに別名(エイリアス)をつける

解説の前提とするディレクトリ構造

今回の解説で前提とするディレクトリ構造は↓になります。

.
├── animals
│   ├── __init__.py
│   ├── cat.py
│   └── dog.py
└── mod.py

animalsはディレクトリで、__init__.py, cat.py, dog.py, mod.pyはファイルです。
cat.pyは↓のように定義されています。

def nyan():
    pass


def gorogoro():
    pass

パッケージ、モジュールとは?

パッケージとは、おおざっぱに言うとディレクトリのことです。
このディレクトリには__init__.pyが含まれることもあります。

モジュールとはimport文でインポートできるファイルやディレクトリのことを言います。

パッケージはモジュールを持つことができますが、モジュールがパッケージを持つことはできません。
パッケージ内にはモジュールが複数含まれていて、それら全体を指してパッケージと言います。
パッケージは特殊なモジュールと言い換えることも出来ます。

たとえば先ほどの↓のディレクトリ構造の場合、

animals
├─ __init__.py
├─ cat.py
└─ dog.py

↑の場合、animalsはディレクトリでパッケージです。
そして__init__.pycat.py, dog.pyはモジュールと呼ばれます。

cat.pydog.pyの中には関数やクラスなどが記述されています。
インポートの目的はこれらの関数やクラスをファイルをまたいで使えるようにすることです。

__init__.pyはマーキングのようなもので、このモジュールがあるとPythonはそのディレクトリをパッケージとして認識します。
__init__.pyにはそのディレクトリをインポートしたときの振る舞いなどの設定を記述することができます。
Pythonがディレクトリを認識してくれない時は、このモジュールを定義すると認識してくれることが多いです。

パッケージ、モジュールのインポートとは?

プロジェクトでは多数の関数やクラスなどが作成されます。
それらのオブジェクトを1つのファイルに記述するのはメンテナンスの面から言ってあまり現実的ではありません。
そのため通常はファイルを分割してモジュールにして、そのモジュールの中に関数やクラスなどを配置します。

import文はそれらのオブジェクトをファイルの中に取り込むための文です。
分割されたパッケージやモジュールがあって、それらのオブジェクトをインポートしたい時に使います。

animals
├─ __init__.py
├─ cat.py
└─ dog.py

具体的に言うと↑で、cat.pyに定義されている関数やクラスをファイルに取り込みたい場合にimport文を使います。

import文の構造

Pythonのimport文の構造はPythonのBNFから参照することができます。

↑のBNFのimport_stmtというのがimport文のことです。
これはimport_nameimport_fromに別れています。

import_nameで記述できるコード例は↓の通りです。

import animals
import animals.cat
import animals.cat, animals.dog
import animals as anims

import_fromで記述できるコード例は↓のようになります。

from animals import cat
from animals import cat as c
from animals import cat, dog
from animals import (
    cat,
    dog,
)
from mod import func1 as f1, func2 as f2
from mod import (
    func1 as f1,
    func2 as f2,
)

importでパッケージ、モジュールをインポート

import文でパッケージをインポートするには↓のようにします。

import animals

print(animals)
# <module 'animals' from '/path/to/animals/__init__.py'>

↑のようにインポートしたオブジェクトはprint()などを使って参照することができます。
animalsのディレクトリ以下にはcat.pydog.pyがありますが、このままだとcat.pydog.pyを参照できません。
ドットで繋げてcatにアクセスしようとすると↓のようなエラーになります。

try:
    print(animals.cat)
except AttributeError as e:
    print(e)
    # module 'animals' has no attribute 'cat'

これはanimalsの正体がanimals/__init__.pyだからです。
__init__.pyの中は空っぽなので、catという属性も存在しないことになります。
このインポート方法でanimals.catを参照したい場合は__init__.pyの中に↓のようなコードを書きます。

from animals import cat 

↑のように__init__.pyを定義するとanimals.catで参照できるようになります。
あるいは↓のようにインポートしてもcatにアクセスできます。

import animals.cat

print(animals.cat)
# <module 'animals.cat' from '/path/to/animals/cat.py'>

↑の場合はインポートした識別子がanimals.catになります。そのためcat単独でアクセスすることはできません。
エイリアスを付ければ問題ないですが、それについては後述します。

またインポートでは一度に複数のモジュールをインポートできます。
カンマ(,)で区切ってパッケージやモジュールを指定します。

import mod, animals

インポートしたモジュールからモジュール内の関数にアクセスすることができます。

import animals.cat

print(animals.cat.nyan)
# <function nyan at 0x1234>

fromを使ったインポート

fromを使ったインポート方法についてです。
fromは↓のように使います。

from animals import cat

print(cat)
# <module 'animals.cat' from '/path/to/animals/cat.py'>

↑のfrom animals import catというインポート文を日本語にすると「animalsというパッケージからcatというモジュールをインポートする」という意味になります。
↑のインポート方法だとcatを直接参照することができます。

fromを使うとモジュールから関数などをインポートできます。

from animals.cat import nyan, gorogoro

print(nyan)
# <function nyan at 0x1234>

print(gorogoro)
# <function gorogoro at 0x1234>

fromを使ったインポートでは↓のようにimport文にカッコを使うことができます。

from animals.cat import (
    nyan,
    gorogoro,
)

カッコを使った場合、↑のように複数行に渡ってimport文を書くことができます。

インポートしたモジュールに別名(エイリアス)をつける

インポートしたモジュールには別名(エイリアス)を付けることができます。
エイリアスはasに続けて書きます。
たとえばanimalsというパッケージ(モジュール)にエイリアスを付けたい場合は↓のようにします。

import animals as anims

print(anims)
# <module 'animals' from '/path/to/animals/__init__.py'>

↑の場合、animalsのエイリアスがanimsになります。
エイリアスを付けて参照先は↑のように変わりません。
もちろん出来ることも元のanimalsの場合と同じです。
エイリアスはただ単に呼び方を変えているにすぎません。
名前の衝突などが発生した場合に使われることがあります。

fromの場合もエイリアスは付けられます。

from animals import cat as c
from animals import (
    cat as c,
    dog as d,
)

おわりに

今回はPythonのimport文について見てみました。
import文を使えるようになると複数のモジュールをまたいだ開発も可能になります。

他のファイルから輸入しよう