初めてのPython(20章)
インポート方法は2種類
- モジュールファイルを指定
- モジュールが格納されているディレクトリパスを指定
ディレクトリパスを指定する方法をパッケージインポートと呼び、指定されるディレクトリのことをパッケージと呼ぶ。
パッケージインポートの場合、【ディレクトリ】が名前空間で、【モジュールファイル】/【サブディレクトリ】が属性。
モジュール数が増えたり、異なるパスにある同名モジュールをインポートする時に使う。
パッケージインポートのやり方
以下のようなファイル構造をパッケージインポートできるようにするためには、
pkg_import
-- __init__.py | |
-- sample1 | |
-- __init__.py | |
-- test1.py | |
-- test2.py | |
-- sample2 |
各ディレクトリに__init__.pyファイルを作成する必要がある。
この構造でいうと、pkg_import直下には必要はないが、作ってて問題は無いので作る。
__init__.py
パッケージインポートをする時に、ここに書かれたコードが自動的に実行されるから「初期化処理」に使われる。
ただし、実行されるのは初回インポートの時だけ。
あと、from ~ import * とやった時にインポートする属性を指定する__all__属性を定義するのもこのファイル
import ~
各ファイルの中身が以下だとする。
(pkg_import/sample1/test1.py) print 'in test1.py' x = 1 (pkg_import/sample1/test2.py) print 'in test2.py' y = 2 (pkg_import/sample2/test1.py) print 'in test1.py' x = 10 (pkg_import/sample2/test2.py) print 'in test2.py' y = 20
sample1/test1.pyとsample2/test1.pyには同じ名前のxという属性があるが、
sample1とsample2でパッケージが異なるので、import ~ならば各々の属性にアクセス出来る。
[kobakoba0723@fedora13-intel64 ~]$ python Python 2.6.4 (r264:75706, Apr 1 2010, 02:55:51) [GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import pkg_import.sample1.test1 in test1.py >>> import pkg_import.sample1.test2 in test2.py>>> import pkg_import.sample2.test1 in test1.py >>> import pkg_import.sample2.test2 in test2.py >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'pkg_import'] >>> dir(pkg_import) ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'sample1', 'sample2']>>> pkg_import.sample1.test1.x 1 >>> pkg_import.sample2.test1.x 10from ~ import ~
from import の場合だと、パッケージの特定の属性を現在の名前空間に直接インポートするので、 同じ名前の属性の場合は、上書きされてしまう。>>> from pkg_import.sample1.test1 import x >>> from pkg_import.sample1.test2 import y >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'pkg_import', 'x', 'y'] >>> x 1 >>> y 2 >>> >>> from pkg_import.sample2.test1 import x >>> from pkg_import.sample2.test2 import y >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'pkg_import', 'x', 'y'] >>> x 10 >>> y 20__all__属性
__init__.pyの中身が以下だとすると、(pkg_import/sample1/__init__.py) __all__ = ["test1", "test2"] (pkg_import/sample2/__init__.py)from ~ import * を実行すると、sample1のtest1/test2だけインポートされる。[kobakoba0723@fedora13-intel64 ~]$ python Python 2.6.4 (r264:75706, Apr 1 2010, 02:55:51) [GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> ls Traceback (most recent call last): File "", line 1, in NameError: name 'ls' is not defined >>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> from pkg_import.sample1 import * in test1.py in test2.py >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'test1', 'test2'] >>> test1 >>> test2 >>> >>> from pkg_import.sample2 import * >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'test1', 'test2'] >>> >>> from pkg_import.sample2 import * >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'test1', 'test2'] >>> test1 >>> test2 >>>