Pythonのパッケージの基本も押さえる:特集:Visual Studioで始めるPythonプログラミング(2/4 ページ)
本稿では複数のモジュールを組織的に取り扱うための機構であるパッケージについて見ていこう。
パッケージ/モジュールのインポート
コードを書いたら、次にパッケージをインポートしてみよう。これには前回も出てきたimport文を使用できる。ここでは次のようにして、PTVSの[Interactive]ウィンドウでパッケージをインポートしてみる。
import mypackage
mypackage
mypackage.mymodule1
[Interactive]ウィンドウで2行目と3行目を実行すると、mypackageパッケージおよびmypackageパッケージに含まれるmymodule1モジュールについての簡単な情報が表示される(と予想される)。なお、ここで見たようにパッケージに含まれるモジュールは「パッケージ名.モジュール名」のようにパッケージ名とモジュール名を「.」で区切って参照する。モジュールがそこに含まれる要素を束ねる名前空間のように機能するのと同様に、パッケージはそこに含まれるモジュールを束ねる名前空間のように機能するということだ。
PTVSの[Interactive]ウィンドウで上のコードを実際に試した例を以下に示す。
予想とは異なり、そのままの状態だとパッケージをインポートしただけでは、その下にあるモジュールまでは自動的にインポートされない(上の画像の最後のエラーを参照)。パッケージに含まれているモジュールをインポートするには幾つかの方法がある。以下に例を示す。
# 形式1
import mypackage.mymodule1
# 形式2
from mypackage import mymodule1
形式1の場合、インポートしたモジュールには「パッケージ名.モジュール名」としてアクセスする。形式2の場合はパッケージ名を省略して、モジュール名のみでアクセス可能だ(この辺は前回に見たモジュールのインポートと、その要素へのアクセスと同様と考えられる)。パッケージがさらにパッケージを含んでいるような場合には「import pkg1.pkg2.module1」あるいは「from pkg1.pkg2 import module1」のような形でインポートを行える。
以下に実行例を示す。なお、パッケージ/モジュールの読み込みを試してみる際には、パッケージがインポート済みの状態ではないように前回も見た[Interactive]ウィンドウ左上にある[リセット]ボタンをその都度クリックして、Pythonの実行環境を真っさらなものにしておくようにしよう(以下の画像の中では(1)で示した「Resetting execution engine」行と「The Python REPL process has exited」行が[リセット]ボタンによる対話環境リセットの出力)。コマンドプロンプトなどからPythonの対話環境を起動している場合は、試すごとに対話環境を終了して(quit()コマンド)、環境を再起動するとよい。
mymodule1モジュールに含まれている関数fooの呼び出しを見てみよう。(2)は形式1でインポートした場合の関数fooの呼び出しだ。この場合は「パッケージ名.モジュール名.関数名」でアクセスを行っている。(2)は形式2でインポートした場合のもの。こちらでは「モジュール名.関数名」でアクセスをする。これは前者ではローカルスコープに「mypackage」という名前(識別子)が導入され、後者では「mymodule1」という名前が導入されているからだ。
現在のローカルスコープ(現在実行中のPythonコードが直接アクセス可能な最も内側のスコープのこと。スコープと名前空間については次回取り上げることにする)に導入されている名前を調べるには組み込み関数dirを使用できる。以下に例を示す。
# 上の形式1でモジュールをインポートして現在のローカルスコープを参照
import mypackage.mymodule1
dir()
dir(mypackage)
# Pythonの対話環境をリセットする
# 上の形式2でモジュールをインポートして現在のローカルスコープを参照
from mypackage import mymodule1
dir()
dir(mymodule1)
形式1でインポートした場合の結果は次のようになる。
>>> import mypackage.mymodule1
hello from mypackage.mymodule1 # mymodule1モジュールが読み込まれたことを示すメッセージ
>>> dir() # ローカルスコープに含まれている名前を表示
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__',
'mypackage']
>>> dir(mypackage) # 「mypackage」に含まれている名前を表示
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__', '__path__', '__spec__', 'mymodule1']
ローカルスコープには「mypackage」が含まれていることと、「mypackage」には「mymodule1」が含まれていることが分かる。このため、この場合には「mypackage.mymodule1」のようにアクセスをすることになる。
一方、形式2でインポートした場合の結果は次のようになる。
>>> from mypackage import mymodule1
hello from mypackage.mymodule1
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__',
'mymodule1']
>>> dir(mymodule1)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', 'foo']
この場合はローカルスコープに「mymodule1」が導入されていること分かる。
もちろん、以下のようにして関数fooを直接インポートすることも可能だ。
from mypackage.mymodule1 import foo
foo()
次に先ほど簡単に説明をした__init__.pyファイルについて見ていこう。
Copyright© Digital Advantage Corp. All Rights Reserved.