Pythonのモジュールの基本を押さえる特集:Visual Studioで始めるPythonプログラミング(2/3 ページ)

» 2016年11月18日 05時00分 公開
[かわさきしんじInsider.NET編集部]

import文

 今見たようにimport文は何らかのコンテキストにモジュールを取り込む(上の場合は[Interactive]ウィンドウのセッションにモジュールをインポートしたが、あるファイルで別のファイルの内容をインポートすることも可能だ)。上では一番シンプルなimport文を使ってみたが、他にも構文がある。以下にimport文の構文を示す。

# シンプルな形式
import モジュール名

# モジュールに別名を付けてインポート
import モジュール名 as 別名

# モジュールから特定の要素をインポート
from モジュール名 import インポートするもの

# 特定の要素に別名を付けてインポート
from モジュール名 import インポートするもの as 別名

# モジュールから全てをインポート
from モジュール名 import *


import文の構文

 一番上のシンプルな形式は既に見た。その次の形式は、インポートするモジュールに別名を付けるものだ。以下に[Interactive]ウィンドウでの実行例を示す。

>>> import PythonApplication1 as PA1
>>> PA1.hello("hoge")
hello hoge


モジュールに別名を付ける

 モジュール名が非常に長い場合や、使いたいモジュールの名前が重複している場合などに、別名を与えることでアクセスを簡単にしたり、重複を避けたりできる。

 次の形式はモジュールから選択的にインポートする。例えば、以下のようにPythonApplication1モジュールに関数を追加したとする。

print("hello from Python");

def hello(name):
  print("hello", name)

def goodbye(name):
  print("goodbye", name)


関数goodbyeを追加

 このモジュールから関数goodbyeだけをインポートするには次のようにする。

from PythonApplication1 import goodbye
goodbye("world")


PythonApplication1モジュールから関数goodbyeのみをインポート

 なお、あるモジュールを既にインポート済みのPythonセッション([Interactive]ウィンドウやpython/idleコマンドで起動される対話環境)で、修正後のモジュールをセッションに反映させるにはimportlibモジュールの関数reloadでモジュールを再読み込みする必要がある(以下のコラムを参照)。[Interactive]ウィンドウではウィンドウ左上の[リセット]ボタンをクリックしてセッションの内容をリセットしてから、import文でモジュールを再度インポートしてもよい。ここでは後者の方法を使って、PythonApplication1モジュールを読み込み直しながら、関数goodbyeだけをインポートしてみよう。

この状況ではPythonApplication1.goodbye関数は呼び出せていない。[Interactive]ウィンドウ左上の[リセット]ボタン(赤枠内)をクリックする
この状況ではPythonApplication1.goodbye関数は呼び出せていない。[Interactive]ウィンドウ左上の[リセット]ボタン(赤枠内)をクリックする
対話環境をリセットしてからモジュールを再インポートしたので、修正後のモジュールの内容が反映された
対話環境をリセットしてからモジュールを再インポートしたので、修正後のモジュールの内容が反映された

[Interactive]ウィンドウ上のセッションをリセットして、モジュールをインポートし直す


 最初の画面の上の方では、これまでに見てきた操作(PythonApplication1モジュールのインポート、別名の付与)が行われている。画面だけでは分かりづらいのだが、その後でPythonApplication1.pyファイルの内容を修正している。その後、import文で再インポートをしたのだが、関数goodbyeの呼び出しに失敗している(上の画像の最初のimport文では「hello from Python」とメッセージが表示されているが、それ以外のimport文ではこのメッセージが表示されていない。これは修正内容が実行されていない=セッションに反映されていないということだ)。

 ウィンドウ左上の[リセット]ボタン(赤枠内)をクリックした後の操作が次の画面だ。「Resetting execution engine」「The Python REPL process has exited」という2行が表示され、環境がリセットされたことが示されたところで、「from モジュール名 import インポートするもの」形式のimport文を実行している。

 ここで重要なのは、この形式でインポートしたものは、ローカルスコープにその名前が導入されるので、アクセスするのにモジュール名を必要としない点だ。そのため、「goodbye("world")」のように関数名を直接記述できる。

importlib.reload関数でモジュールの修正内容を対話環境に反映する

 上で見たように、PTVSの[Interactive]ウィンドウでは[リセット]ボタンを使えば、対話環境をリセットして、モジュールをインポートし直すといったことが簡単に行える。しかし、python/idleコマンドで起動した対話環境ではこの方法は使えないし、[Interactive]ウィンドウであっても多数のモジュールをインポートして動作を試しているといった場合には、リセットするたびに必要なモジュールを全てインポートし直さなければならない。そうしたときにはimportlibモジュールの関数reloadを使うのが便利だ。以下に使用例を示す。

>>> import importlib  # importlibモジュールをインポート
>>> importlib.reload(PythonApplication1)  # 関数reloadを呼び出す
hello from Python
<module 'PythonApplication1' from '.\\PythonApplication1.py'>
>>> PythonApplication1.goodbye("world")   # 修正後の内容が反映された
goodbye world


モジュールの内容を再読み込み

 関数reloadを呼び出す際には引数にモジュール名を指定するが、これは既に現在のセッションに導入済みの名前なのでシングルクオート/ダブルクオートで囲む必要がない点には注意しよう。


 4番目の形式では選択的なインポートをした上で、それに別名を付ける。以下に[Interactive]ウィンドウでの実行例を示す。

>>> from PythonApplication1 import hello as foo
>>> foo("world")
hello world
>>> hello("world")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'hello' is not defined


インポートした関数に別名を付ける

 3番目(「from モジュール名 import インポートするもの」)の形式と同様、インポートした名前はローカルスコープに導入されるのでモジュール名なしで、それを直接利用できる。また、元の名前では利用できない(最後のエラーに注目)。

 最後の形式(「from モジュール名 import *」)はモジュール内の全ての要素をローカルスコープに導入する。以下に例を示す(ここでは[リセット]ボタンでセッションをリセットしたものとする)。

>>> from PythonApplication1 import *
hello from Python
>>> hello("world")
hello world
>>> goodbye("world")
goodbye world


全てをローカルスコープにインポートする

 この形式であるモジュールから全てをインポートすることはあまり推奨されていない。これは未知のモジュールから全てをインポートすることで、既に定義されている(何らかの値や関数などが代入されている)名前がインポートしたもので上書きされる可能性があるからだ。

 また、この形式では「全て」がインポートされると述べたが、実際には「_」で始まる名前のものはインポートされない。前回も触れたが「_」で始まる名前は内部使用を意味するものであり、Pythonではそのような名前が特別扱いされている。興味のある方は実際に試してみてほしい。

 ここまではPythonのモジュールの基本中の基本だが、まだ重要なこともある。次ページではそれらについて見ていく。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。