Pythonはimport文によって様々な機能(ライブラリ)を追加して使うことができます。今回はそのimport文の書き方ということで、色々なインポートの方法をご紹介したいと思います。
以下では「ライブラリ」や「モジュール」という単語が出てきますが、違いが分からないという方も安心してください。このページではどれも同じ、「機能を追加するもの」と考えていただいてかまいません。
通常のインポート
基本的には以下の方法でライブラリのインポートを行います。
import ライブラリ名
#以下は一例
import random
import sys
import statistics
インポートしたライブラリは、ライブラリ名.プロパティ名orメソッド名
で、そのライブラリに含まれるプロパティやメソッドを使用できます。
random.randint(1,10) #4 (1~10のランダムな整数を出力)
sys.platform #win32 (実行中のOSを表示)
statistics.mean([1,2,3,4,5]) #3 (平均値を算出)
カンマ区切りは非推奨
カンマで区切ることで複数のライブラリを1行でインポートすることも可能です。ただし推奨はされていません。
import random, sys, statistics
エラーにはなりませんが多くのライブラリをインポートした場合、可読性は下がります。書式としては1行に1つのインポートがより良いとされています。
部分的なインポート
日時を扱うdatetimeのように複数の型(クラス)を内包しているライブラリの場合、
import datetime
datetime.datetime.now()
上の例のように、メソッドを使用するのにライブラリ名.クラス名.メソッド名
としなければならない場合もあります。これを簡略化したいという時は、
from datetime import datetime
from ライブラリ名 import クラス名やメソッド名
と記述しましょう。上の例ではdatetimeモジュールから、datetime型のみインポートという意味になります。
このようにインポートした場合、ライブラリ名は記述する必要が無くなり、
datetime.now()
これでdatetime型のnowメソッドが使用可能になります。ただしdate型など、インポートしていないものは使用できません。
これは他のライブラリでも可能です。例としてstatisticsモジュールから、平均値を算出するmeanメソッドだけをインポートしてみます。
from statistics import mean
print(mean([54,20,299,58,11])) #88.4
まるで組み込み関数のように、モジュールのメソッドをメソッド名だけで使用できるようになります。
同じライブラリから複数選択
statisticsモジュールには統計のための様々なメソッドが存在します。同じような書き方で他のメソッドも同時にインポートしてみましょう。
from statistics import mean, median, mode
print(mean([54,20,299,58,11])) #88.4 (平均値)
print(median([10,40,20,80,20,30,30])) #30 (中央値)
print(mode([10,10,10,20,20,20,20,30,30])) #20 (最頻値)
この場合はカンマ区切りで記述しても問題はありません。
名前の衝突に注意
from statistics import *
fromを使ったインポートでは「*」(アスタリスク)を使って、そのモジュールの全てのクラス、メソッド、プロパティを一気にインポートすることも可能です。このアスタリスクで「全て」を指定する方法をワイルドカード指定と呼びます。
ただしこれは推奨されていません。なぜならこの方法は、グローバルスコープに変数をばら撒いているようなものだからです。
こうなるともう、インポートしたライブラリに使用されている全ての名前は、他の用途で使うことができません。
from statistics import *
mean = 5
print(mean([54,20,299,58,11]))
#TypeError: 'int' object is not callable
変数meanはstatisticsモジュールのmeanメソッドと名前が被ってしまっているため、意図しないエラーが起こります。これを「名前の衝突」と言います。
ライブラリ名.メソッド名
と呼び出すことは少々面倒に感じるかもしれませんが、「(ライブラリ名)の(メソッド名)」と但し書きを付けることによって、グローバルスコープが名前で溢れかえることを防ぐことができます。
上と同じことですが、このような場合もfromを使ったインポートは避けるべきです。
from datetime import time
import time
a = time(12,30)
print(a.hour)
#TypeError: 'module' object is not callable
datetimeモジュールからtime型のみインポートし、さらに全く別のライブラリであるtimeモジュールをインポートしています。
これによって4行目のtime(12,30)
はdatetimeモジュールのtime型コンストラクタであるにも関わらず、timeモジュールを呼び出していると勘違いされてしまっています。
名前の衝突には十分注意しましょう。
別名でインポート
あるライブラリをインポートする際、ライブラリ名ではなく別名で扱う場合は、「as」を使ってインポートします。
import webbrowser as wb
wb.open("http://google.co.jp")
上のコードでは「webbrowser」というライブラリを「wb」としてインポートし、以降のコードではwbとして使用しています。
なおこの方法で読み込んだライブラリは、本来の名前では使用できないので注意してください。
import webbrowser as wb
webbrowser.open("http://google.co.jp")
#NameError: name 'webbrowser' is not defined
この点だけ押さえておけば、fromを使う場合とは違い名前の衝突はほぼ起こらず、副作用の少ない簡略化が実現できます。
まとめ
import a
→ライブラリaを通常インポート。1行につき1つのインポートが推奨されるfrom a import b
→aのクラスやメソッドを部分的にインポート。記述を短縮できるが、名前の衝突には注意import a as b
→aをbとしてインポート。以降はbとしてしか呼び出せない