初めてのPython(20章)

インポート方法は2種類

  • モジュールファイルを指定
  • モジュールが格納されているディレクトリパスを指定

ディレクトリパスを指定する方法をパッケージインポートと呼び、指定されるディレクトリのことをパッケージと呼ぶ。

パッケージインポートの場合、【ディレクトリ】が名前空間で、【モジュールファイル】/【サブディレクトリ】が属性。

モジュール数が増えたり、異なるパスにある同名モジュールをインポートする時に使う。

パッケージインポートのやり方

以下のようなファイル構造をパッケージインポートできるようにするためには、

pkg_import
-- __init__.py
-- sample1
-- __init__.py
-- test1.py
-- test2.py
-- sample2
|-- __init__.py |-- test1.py |-- test2.py

ディレクトリに__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 10
from ~ 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

>>>