Python の import と from import の 違い って?
Python でコーディングをしているときに、 import だけじゃなく from とか出てきて違いがいまいちよくわからない、ということがあると思います。
まず大事なのが、Python における、
パッケージ、モジュール、識別子
の3つの用語を理解することです。
大雑把にいうと、
・パッケージ は ディレクトリ名
・モジュール は ファイル名(拡張子除く)
・識別子 は 関数名や変数名
です。
これを理解してないとあばばばばとなります。
例えば以下のような構成があったとしましょう。
sample_directoryという名前のディレクトリ配下にsample1.py、sample2.pyというスクリプトファイルがあります。
sample_directory\
sample1.py
sample2.py
この sample_directory が パッケージ です。
そして、sample1 と sample2 が モジュール です。(.pyを除いたファイル名がモジュール)
そして、smple1.py の中身が以下だとすると、
def func():
print('hoge')
ここまでのことを理解したらあとはもう簡単です。
import モジュール
と書かれていたら、そのモジュール(.py)の中にある全部の識別子(関数や変数)が使えるようになる、ということです。
モジュールのみではなく、 "." で以下のように連なって書かれているのを見たことがあると思います。
import パッケージ.モジュール
これはパッケージはディレクトリと覚えたと思いますが、例えば上記例の構成のように、 sample_directory配下にあるsample1(.py)もジュールをimportしたい場合に、
import sample_directory.sample1
と書いているだけなんですね。
import ディレクトリ名.ファイル名(ただし.pyは除く)
ということです。
もちろんディレクトリは複数あっても問題ないので、深いディレクトリ配下だと、
import パッケージ.パッケージ.パッケージ.モジュール
なんて感じになります。
import単体利用時は簡単ですね。
で、import単体は簡単でしたが、ここで from が出てくるとややこしくなってきます。
どうしてかというと大きく2パターンになるからです。
パターン1は、
from パッケージ import モジュール
パターン2は、
from (パッケージ.)モジュール import 識別子
です。
パターン1は、パッケージ配下にあるモジュールをimportしています。
でもこれって、
import パッケージ.モジュール
と同じじゃね?と思われた方、正しいです。同じなんですね。
同じならいらないんじゃ?というのがあるのですが、 * という書き方があるんですね。
from パッケージ import *
(ただし、 __init__.py に __all__ 設定しないといけなかったりちょっと面倒ですが)
のでこういう書き方も使われることもあります。 (スクリプトを書くときどのモジュールの関数かいまいちよくわからなくなるのでちゃんと指定することが多いです)
次にパターン2ですが、これはモジュールの中の必要な識別子(関数とか)だけをimportしたい場合ですね。
これも、先ほど同様、個別指定ではなく、
from モジュール import *
import モジュール
がそのように書く人もいます ので、他人のソースを見ると、
import モジュール
と書かれていることもあれば、
from モジュール import *
とかも出てきてなんじゃらほい、となってしまうわけです。
しかも、fromの後ろがパッケージなのかモジュールなのかはぱっと見で区別できません。
パッケージかモジュールかが異なればその後ろにあるimportの次がモジュールなのか識別子なのかがわかりません。
ので、ちょっと混乱してしまうわけですね。
でも、パッケージはディレクトリ、モジュールはファイル、としっかり理解していれば、物理的なディレクトリ構成を見て解決できるわけです。
以上です!