[Python入門]#13 import文の書き方

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
型のエラー: int型は関数のように呼び出すことができない

変数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
名前のエラー: webbrowserという名前は定義されていない

この点だけ押さえておけば、fromを使う場合とは違い名前の衝突はほぼ起こらず、副作用の少ない簡略化が実現できます。

まとめ

  1. import a→ライブラリaを通常インポート。1行につき1つのインポートが推奨される
  2. from a import b→aのクラスやメソッドを部分的にインポート。記述を短縮できるが、名前の衝突には注意
  3. import a as b→aをbとしてインポート。以降はbとしてしか呼び出せない
タイトルとURLをコピーしました