Pythonのパッケージの基本も押さえる特集:Visual Studioで始めるPythonプログラミング(4/4 ページ)

» 2016年11月25日 05時00分 公開
[かわさきしんじInsider.NET編集部]
前のページへ 1|2|3|4       

サブパッケージを含むパッケージ

 ここでは以下のようにmypackageパッケージ内にsubpackageパッケージを作成し、そこにsubmodule1.pyファイルとsubmodule2.pyファイルを作成した。

サブパッケージとサブモジュールの作成 サブパッケージとサブモジュールの作成

 2つの「.py」ファイルの内容はこれまでと同様なので、コードは割愛する。mypackage\__init__.pyファイルは次のように変更した。

__all__ = ["mymodule1", "mymodule2"]


mypackage\__init__.pyファイルの内容

 mypackage\subpackage\__init__.pyファイルの内容は以下の通り。

__all__ = ["submodule1", "submodule2"]


mypackage\subpackage\__init__.pyファイルの内容

 既に述べたように、パッケージがサブパッケージを含んでいる場合には、以下のようにしてサブパッケージのインポートが可能だ([Interactive]ウィンドウでの出力結果)。

>>> import mypackage.subpackage.submodule1
submodule 1
>>> mypackage.subpackage.submodule1.bar()
mypackage.subpackage.submodule1.bar
>>> from mypackage.subpackage import submodule2
hello from submodule 2
>>> submodule2.bar()
hello from bar in mypackage.subpackage.submodule2


サブパッケージ/サブモジュールのインポート

 ただし、注意点が1つある。それは、先ほど見た「from パッケージ名 import *」ではサブパッケージの内容はインポートされないという点だ。実際に試した例を以下に示す。

>>> from mypackage import *
hello from mypackage.mymodule1
hello from module2 in mypackage
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__',
'mymodule1', 'mymodule2']
>>> from mypackage.subpackage import *
submodule 1
hello from submodule 2
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__',
'mymodule1', 'mymodule2', 'submodule1', 'submodule2']


「from パッケージ名 import *」ではサブパッケージはインポートされない

 上の例で示しているように、サブパッケージに関しては別途インポートを行う必要がある。これは「import mypackage」としてトップレベルのパッケージをインポートしても、その下のモジュールが自動的にはインポートされなかったのと同様だ。

 最後に、パッケージ内のモジュールから、同一パッケージ内の別モジュールを参照する方法について触れておこう。これにも幾つかの方法がある。一番簡単なのは以下のようにパッケージの階層をフルに記述することだ。

from mypackage.subpackage.submodule2 import bar as baz

print("submodule 1")

def bar():
  print("mypackage.subpackage.submodule1.bar")


パッケージ階層をフルに記述してインポートを行う(mypackage\subpackage\submodule1.pyファイル)

 上のサンプルコードは「mypackage\subpackage\submodule1.py」ファイルのものであり、ここでは同じ階層(mypackage\subpackageパッケージ)内のsubmodule2.pyで定義されている関数barを「baz」という別名でインポートしている。

 しかし、これは次のように「.」を利用して階層を逆順にさかのぼる相対的な方法(相対インポート)でも指定できる(「.」は現在のパッケージ、「..」は親パッケージといった具合)。

from .submodule2 import bar as baz

print("submodule 1")

def bar():
  print("mypackage.subpackage.submodule1.bar")


同一パッケージ内の別ファイルを相対インポート(mypackage\subpackage\submodule1.pyファイル)

 「.」とパッケージ名/モジュール名の間には半角スペースを入れてもよいし、入れなくてもよい。さかのぼれるのはパッケージ内のみであることには注意しよう。以下にもう1つ例を示す。これは親階層(「..」によりmypackageパッケージ階層を参照し、そこからさらに階層を下っている)。

from ..mymodule1 import foo
from .. subpackage.submodule2 import bar as baz

print("submodule 1")

def bar():
  print("mypackage.subpackage.submodule1.bar")


「..」により親階層を起点としてパッケージを参照


 本稿ではPythonのパッケージの基礎知識を取り上げた。実際のところ、Pythonには「名前空間パッケージ」と呼ばれる「同じパッケージ名で始まる複数のパッケージを単一のパッケージに束ねる」機構もあるが、本稿ではこれは取り上げなかった。興味のある方はPythonの言語レファレンス「5.2.2. 名前空間パッケージ」「PEP 420」(英語)などを参照してほしい。次回は、本稿でも少し出てきたスコープ、名前空間について見ていこう。

「特集:Visual Studioで始めるPythonプログラミング」のインデックス

特集:Visual Studioで始めるPythonプログラミング

前のページへ 1|2|3|4       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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