検索
連載

[Python入門]モジュールの使い方Python入門(2/3 ページ)

Pythonには多くの「標準ライブラリ」や「外部ライブラリ」が「モジュール」として提供されている。それらを自分のプログラムで使う方法を説明する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

import as文:指定した名前でインポート

 前ページで紹介した基本的な構文以外によく使われる2つのインポート方法の最初の構文が以下に示すものだ。

import as文

import module_name as identifier


 module_nameで指定されるモジュールをインポートする。このとき、プログラムからはidentifierに指定した名前でアクセスする。


 WebでPythonのサンプルコードを眺めていると、例えば、次のようなコードを見かけることがあるだろう。これが上の構文を使ったモジュールのインポートの例だ。

import numpy as np

numpyモジュールを「np」という名前でインポート

 これはNumPyというPython用の数値計算パッケージを(既にそれをインストール済みの環境で)インポートする。ただし、最後に「as np」とある。この場合、インポート後は「as」に続けて書かれた名前でそのパッケージ(モジュール)にアクセスできるようにするためのものだ。つまり、プログラム内では「np」という名前(識別子、identifier)でこのモジュールにアクセスする。

 上の例の「numpy」と「np」を比較すると、5文字と2文字で文字数の差もそれほどではなく、キーボードを打つのも苦にはならないかもしれない。が、インポートするのが「tensorflow」モジュールだったらどうだろう。10文字のモジュール名を毎回入力するのは面倒だし、打ち間違いも発生するかもしれない。そこで「import tensorflow as tf」とすれば、その後はTensorflowが提供する機能を利用するためには最初に「tf」という2文字を入力するだけよくなる(し、「import numpy as np」や「import tensorflow as tf」という記述はよく見られるので、それに合わせた方が通りがよいということもある)。

 このようにモジュールのインポート時に別名を与えるのはよくあることなので覚えておこう。ただし、この場合には、元の名前(上の例では「numpy」や「tensorflow」)は使えないので気を付けること。

 例えば、先ほどのrandomモジュールに「rnd」という別名を与えてインポートをしてみよう。

import random as rnd

randomモジュールを「rnd」という別名でインポート

 これを対話環境で入力、実行する際には、その前にPython 3カーネルをリスタートする必要がある(既にインポート済みの「random」という名前が有効なため)。コマンドプロンプトやシェルから「python」などと入力して、対話環境を起動しているときには、それを一度終了させよう。

Python 3カーネルをリスタート
Python 3カーネルをリスタート
ダイアログが表示されるので[Restart]ボタンをクリック
ダイアログが表示されるので[Restart]ボタンをクリック
上のコードをセルに入力して実行(このコードの入力履歴が[1]になっている、つまり上にあった2つのセルは未実行の状態になることに注意)
上のコードをセルに入力して実行(このコードの入力履歴が[1]になっている、つまり上にあった2つのセルは未実行の状態になることに注意)

Python 3カーネルをリセットして、セルを実行


 これにより、上にあった2つのセルに入力したPythonのコードは未実行の状態となる。そのため、実行したセルの左に表示される入力履歴が「[1]」となっていることに注意しよう(上の2つのセルの入力履歴は「[1]」と「[2]」のままだが、実際には実行されていない)。この状態で以下のコードを試してみる。

print(rnd.randint(1, 20))
print(random.randint(1, 20))

「rnd」と「random」という名前を使ってrandint関数を呼び出してみる

 セルにこのコードを入力して、実行すると、次のような結果になるはずだ。

「rnd.randint」呼び出しは可能でも、「random.randint」呼び出しは不可能
「rnd.randint」呼び出しは可能でも、「random.randint」呼び出しは不可能

 最初の行「print(rnd.randint(1, 20))」は実行されているが、次の行「print(random.randint(1, 20))」で例外が発生している。その理由は「randomという名前が定義されていない」ことであることも分かる。つまり、「import random as rnd」という形式でrandomモジュールをインポートすると、「random」という名前ではこのモジュールにはアクセスできないということだ。別名を与えた場合には、元の名前ではモジュールにアクセスできないことは覚えておこう。

from import文:特定の関数だけをインポート

 最後に、あるモジュールから特定の機能(関数など)だけをインポートする方法についても見ておこう(これもPythonのコードを見ているとよく出てくる表記だ)。以下に構文を示す。

from import文

from module_name import identifier


 module_nameで指定されるモジュールからidentifierで指定されるもの(だけ)をインポートする。1つのモジュールから複数の関数などをインポートするには、identifierをカンマ区切りで並べていく。identifierの位置にアスタリスク「*」を記述すると、module_nameモジュールが公開している全てのものがインポートされる。


 この構文ではまず「from」を書き、次にインポート対象のモジュールの名前を記述する。それに続けて「import インポートするもの」と書く。例えば、randomモジュールのrandint関数だけをインポートしたければ次のように書けばよい。

from random import randint

randomモジュールのrandint関数だけをインポート

 この場合、「randint」という名前がそのまま利用できるようになる。上の例なら、「random.」や「rnd.」を付けなくても、そのまま「randint(……)」というように関数を呼び出せるということだ。

print(randint(1, 20))

「random.」を付けずにそのままrandint関数を呼び出せる

 実行結果を以下に示す。

実行結果
実行結果

 この書き方だと、必要ない要素(例えば、「random」というモジュール名や、randomモジュールが提供する他の関数など)が自分のプログラムに潜り込むことがない。「自分が必要とするものだけ」をプログラムに導入することで、プログラム内で誤ってその名前を使ったり、何かのモジュールが提供する機能の名前と自分が使う変数名などが重複したりしないようにできる。モジュールが提供する機能を幾つも使うとか「この機能はこのモジュール由来」ということをプログラム中でハッキリと示したいのであれば「import モジュール名」形式を、特定の機能だけを使うというのであれば今紹介した「from モジュール名 import インポートする関数」形式を使うのがよいだろう。

 なお、1つのモジュールから複数の関数をインポートしたいときには、カンマ区切りでそれらを複数並べていく。例えば、randomモジュールからrandrange関数とrandint関数をインポートするには次のように記述する。

from random import randrange, randint

randomモジュールからrandrange関数とrandint関数をインポートする

 なお、「from モジュール import *」という書き方も可能だ。この場合には、そのモジュールが公開している全てのものがインポートされる。ただし、これは現在のローカル名前空間に一度に多数の関数(やクラスなど)を導入することになる。

 「from モジュール import 関数」であれば、どんな名前の関数がインポートされるかがハッキリと分かるが、「*」を使ってしまうと、何がインポートされるのかがハッキリしない。つまり、プログラムコードの中に突然知らない名前が出現することになる。モジュールが大量の関数を提供しているのならば、不必要なものまで現在の名前空間にインポートされることになる。このようなことから、「from モジュール import *」を使うことはあまり推奨されていない。

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る