Python の import と from import の 違い って?
Python でコーディングをしているときに、 import だけじゃなく from とか出てきて違いがいまいちよくわからない、ということがあると思います。
import構文は大きく4つです。
① import (パッケージ.)モジュール
② import (パッケージ.)モジュール as 別名
③ from (パッケージ.)モジュール import 識別子
④ from (パッケージ.)モジュール import 識別子 as 別名
なお、
from (パッケージ.)モジュール import *
という記述もありますが、ソースが見づらくなるし、名前の衝突も起きるので非推奨です。
①~④を説明する前に、パッケージ、モジュール、識別子についてまとめておきます。
Python における、
パッケージ、モジュール、識別子
は、大雑把にいうと、
・パッケージ は ディレクトリ名
・モジュール は ファイル名(拡張子除く)
・識別子 は 関数名や変数名
のことです。
これを理解してないと自作のライブラリをインポートするときにあばばばばとなります。
例えば以下のような構成があったとしましょう。
sample_directoryという名前のディレクトリ配下にsample1.py、sample2.pyというスクリプトファイルがあります。
sample_directory\
sample1.py
sample2.py
この sample_directory が パッケージ です。
そして、sample1 と sample2 が モジュール です。(.pyを除いたファイル名がモジュール)
そして、smple1.py の中身が以下だとすると、
def func():
print('hoge')
ここまでのことを理解したらあとはもう簡単です。
① import (パッケージ.)モジュール
一番よくみる import (パッケージ.)モジュール についてです。
以下のコードを見てみましょう。
import math
result = math.sqrt(16)
import mathはmathモジュール内、言い換えるとmath.pyに含まれるすべての関数を利用できるようにするよ、という宣言です。
そして、result = math.sqrt(16) といった形でmathモジュール内にあるsqrt識別子、すなわち関数を呼べるようになっているわけです。
簡単といえば簡単ですね!
もしmath.pyがhogeディレクトリ配下にあるなら、
import hoge.math
になる、ということです。hogeディレクトリがパッケージということなんですね。
通常、Pythonをインストールしたら使えるmathなどは環境変数でPathが通っているので特に問題なくimport mathという形で利用できるようになりますが、
自作のPythonモジュールをimportしたい場合は呼び出し元のpythonスクリプトファイルからの相対パスになるので気を付けましょう!
② import (パッケージ.)モジュール as 別名
import (パッケージ.)モジュール as 別名 は簡単ですね。別の名前にする、ということです。短縮形の別名にすることが多いですね。
import matplotlib.backends.backend_tkagg as mbtk
canvas = mbtk.FigureCanvasTkAgg(figure, master=root)
のように、matplotlib.backends.backend_tkaggにmbtkという別名をつけたおかげで、mbtk.FigureCanvasTkAggという短さでコードを書くことができました。
これをもし as mbtk としなかったら、 matplotlib.backends.backend_tkagg.FigureCanvasTkAgg となったわけです。
別名の便利さがわかってもらえたでしょうか?
ただ、別名はきちんと一意につけないと重複した名前などを付けてしまうと問題が生じるので注意しないといけません!
③ from (パッケージ.)モジュール import 識別子
次はfromです。importだけで充分だろと思うのですが、fromという形式をpythonでは採用しています。
以下のコードを見てみましょう。
from math import sqrt
result = sqrt(16)
結果、sqrt(16) と呼び出すことができるわけですね。
これを① import (パッケージ.)モジュールと比較してみましょう。
import math
result = math.sqrt(16)
・・・でもそれって良いことでしょうか?確かにmath.文短くはなりましたが、急にsqrtとか言われても誰?となりそうです。math以外にもsqrtという関数をもつモジュールがあればなおさらです。
ただまぁそれでも、 from math import sqrt とまで特定されていれば、それを見れば間違えないでしょうけど、 from math import * という書き方もあるんですね。
そんなことされた日には sqrtがどのモジュールからきたのかわからなくなる可能性が出てきます。
なので、最初に from (パッケージ.)モジュール import * は非推奨!と述べたわけですね。
基本的にはfromは要らないんじゃないかと思っています。import だと巨大なモジュールから全部の識別子を引っ張ってくるので重たいとかの問題がもしかしたら遠い過去にあったのかもしれませんが今はそんなのなんの問題にもなりません。
import モジュールでコードをすべて統一したほうがわかりやすくて私としてはおすすめです。
④ from (パッケージ.)モジュール import 識別子 as 別名
これは②と同じなので割愛です。
ここまででimport 構文について理解できたと思います。
自作モジュールをimportするには
以下のようなフォルダ構成だったとします。
my_project/
├── main.py
└── mylib/
├── __init__.py
├── my_utils.py
import mylib.my_utils
mylibディレクトリがパッケージ、my_utils.pyがモジュール名(.py拡張子はのぞく)になる、という寸法ですね!
ちなみにすでに__init__.pyはおまじないの空ファイルでなくて問題ないです。
パッケージはディレクトリ、モジュールはファイル、識別子は関数、これらをしっかり理解していればimport文は恐れるに足りません。
以上です!