6. モジュール
*************

Python インタプリタを終了させ、再び起動すると、これまでに行ってきた定
義 (関数や変数) は失われています。ですから、より長いプログラムを書きた
いなら、テキストエディタを使ってインタプリタへの入力を用意しておき、手
作業の代わりにファイルを入力に使って動作させるとよいでしょう。この作業
を *スクリプト (script)* の作成と言います。プログラムが長くなるにつれ
、メンテナンスを楽にするために、スクリプトをいくつかのファイルに分割し
たくなるかもしれません。また、いくつかのプログラムで書いてきた便利な関
数について、その定義をコピーすることなく個々のプログラムで使いたいと思
うかもしれません。

こういった要求をサポートするために、Python では定義をファイルに書いて
おき、スクリプトの中やインタプリタの対話インスタンス上で使う方法があり
ます。このファイルを *モジュール (module)* と呼びます。モジュールにあ
る定義は、他のモジュールや *main* モジュール (実行のトップレベルや電卓
モードでアクセスできる変数の集まりを指します) に *import* (取り込み)
することができます。

モジュールは Python の定義や文が入ったファイルです。ファイル名はモジュ
ール名に接尾語 ".py" がついたものになります。モジュールの中では、(文字
列の) モジュール名をグローバル変数 "__name__" で取得できます。例えば、
お気に入りのテキストエディタを使って、現在のディレクトリに以下の内容の
ファイル "fibo.py" を作成してみましょう:

   # Fibonacci numbers module

   def fib(n):    # write Fibonacci series up to n
       a, b = 0, 1
       while b < n:
           print b,
           a, b = b, a+b

   def fib2(n):   # return Fibonacci series up to n
       result = []
       a, b = 0, 1
       while b < n:
           result.append(b)
           a, b = b, a+b
       return result

次に Python インタプリタに入り、モジュールを以下のコマンドで import し
ましょう:

   >>> import fibo

この操作では、"fibo" で定義された関数の名前を直接現在のシンボルテーブ
ルに入力することはありません。単にモジュール名 "fibo" だけをシンボルテ
ーブルに入れます。関数にはモジュール名を使ってアクセスします:

   >>> fibo.fib(1000)
   1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
   >>> fibo.fib2(100)
   [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
   >>> fibo.__name__
   'fibo'

関数を度々使うのなら、ローカルな名前に代入できます:

   >>> fib = fibo.fib
   >>> fib(500)
   1 1 2 3 5 8 13 21 34 55 89 144 233 377


6.1. モジュールについてもうすこし
=================================

モジュールには、関数定義に加えて実行文を入れることができます。これらの
実行文はモジュールを初期化するためのものです。これらの実行文は、インポ
ート文の中で *最初に* モジュール名が見つかったときにだけ実行されます。
[1] (ファイルがスクリプトとして実行される場合も実行されます。)

各々のモジュールは、自分のプライベートなシンボルテーブルを持っていて、
モジュールで定義されている関数はこのテーブルをグローバルなシンボルテー
ブルとして使います。したがって、モジュールの作者は、ユーザのグローバル
変数と偶然的な衝突が起こる心配をせずに、グローバルな変数をモジュールで
使うことができます。一方、自分が行っている操作をきちんと理解していれば
、モジュール内の関数を参照するのと同じ表記法 "modname.itemname" で、モ
ジュールのグローバル変数をいじることもできます。

モジュールが他のモジュールを import することもできます。 "import" 文は
全てモジュールの(さらに言えばスクリプトでも)先頭に置きますが、これは慣
習であって必須ではありません。 import されたモジュール名は import を行
っているモジュールのグローバルなシンボルテーブルに置かれます。

"import" 文には、あるモジュール内の名前を、import を実行しているモジュ
ールのシンボルテーブル内に直接取り込むという変型があります。例えば:

   >>> from fibo import fib, fib2
   >>> fib(500)
   1 1 2 3 5 8 13 21 34 55 89 144 233 377

この操作は、import の対象となるモジュール名をローカルなシンボルテーブ
ル内に取り入れることはありません (従って上の例では、 "fibo" は定義され
ません)。

モジュールで定義されている名前を全て import するという変型もあります:

   >>> from fibo import *
   >>> fib(500)
   1 1 2 3 5 8 13 21 34 55 89 144 233 377

上の操作は、アンダースコア ("_") で開始する名前以外の全ての名前を
import します。

一般的には、モジュールやパッケージから "*" を import するというやり方
には賛同できません。というのは、この操作を行うとしばしば可読性に乏しい
コードになるからです。しかし、対話セッションでキータイプの量を減らすた
めに使うのは構わないでしょう。

モジュール名の後に "as" が続いていた場合は、 "as" の後ろの名前を直接、
インポートされたモジュールが束縛します。

   >>> import fibo as fib
   >>> fib.fib(500)
   0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

これは実質的には "import fibo" と同じ方法でモジュールをインポートして
いて、唯一の違いはインポートしたモジュールが "fib" という名前で取り扱
えるようになっていることです。

このインポート方法は "from" が付いていても使え、同じ効果が得られます:

   >>> from fibo import fib as fibonacci
   >>> fibonacci(500)
   0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

注釈: 実行効率上の理由で、各モジュールはインタープリタの 1 セッショ
  ンごと に 1 回だけ import されます。従って、モジュールを修正した場合
  には、 インタープリタを再起動させなければなりません -- もしくは、そ
  の場で手 直ししてテストしたいモジュールが 1 つだった場合には、例えば
  "reload(modulename)" のように "reload()" を使ってください。


6.1.1. モジュールをスクリプトとして実行する
-------------------------------------------

Python モジュールを

   python fibo.py <arguments>

と実行すると、"__name__" に "__main__" が設定されている点を除いて
import したときと同じようにモジュール内のコードが実行されます。つまり
モジュールの末尾に:

   if __name__ == "__main__":
       import sys
       fib(int(sys.argv[1]))

このコードを追加することで、このファイルが import できるモジュールであ
ると同時にスクリプトとしても使えるようになります。なぜならモジュールが
"main" ファイルとして起動されたときだけ、コマンドラインを解釈するコー
ドが実行されるからです:

   $ python fibo.py 50
   1 1 2 3 5 8 13 21 34

モジュールが import された場合は、そのコードは実行されません:

   >>> import fibo
   >>>

この方法はモジュールに便利なユーザインターフェースを提供したり、テスト
のために (スクリプトをモジュールとして起動しテストスイートを実行して)
使われます。


6.1.2. モジュール検索パス
-------------------------

"spam" という名前のモジュールをインポートするとき、インタープリターは
まずその名前のビルトインモジュールを探します。見つからなかった場合は、
"spam.py" という名前のファイルを "sys.path" にあるディレクトリのリスト
から探します。 "sys.path" は以下の場所に初期化されます:

* 入力されたスクリプトのあるディレクトリ (あるいはカレントディレクト
  リ )。

* "PYTHONPATH" (ディレクトリ名のリスト。シェル変数の "PATH" と同じ構
  文 )。

* インストールごとのデフォルト

初期化された後、 Python プログラムは "sys.path" を修正することができま
す。スクリプトファイルを含むディレクトリが検索パスの先頭、標準ライブラ
リパスよりも前に追加されます。なので、ライブラリのディレクトリにあるフ
ァイルよりも、そのディレクトリにある同じ名前のスクリプトが優先してイン
ポートされます。これは、標準ライブラリを意図して置き換えているのでない
限りは間違いのもとです。より詳しい情報は 標準モジュール を参照してくだ
さい。


6.1.3. "コンパイル" された Python ファイル
------------------------------------------

たくさんの標準モジュールを使うような短いプログラムの起動時間を大きく高
速化するために、 "spam.py" が見つかったディレクトリに "spam.pyc" とい
う名前のファイルがあった場合には、このファイルをモジュール "spam" の "
バイトコンパイルされた" バージョンであると仮定します。 "spam.pyc" を生
成するのに使われたバージョンの "spam.py" のファイル修正時刻が
"spam.pyc" に記録されており、この値が一致しなければ "spam.pyc" ファイ
ルは無視されます。

通常、 "spam.pyc" ファイルを生成するために何かをする必要はありません。
"spam.py" が無事コンパイルされると、常にコンパイルされたバージョンを
"spam.pyc" へ書き出すよう試みます。この試みが失敗してもエラーにはなり
ません。何らかの理由でファイルが完全に書き出されなかった場合、作成され
た "smap.pyc" は無効であるとみなされ、それ以後無視されます。
"spam.pyc" ファイルの内容はプラットフォームに依存しないので、 Python
のモジュールのディレクトリは異なるアーキテクチャのマシン間で共有するこ
とができます。

エキスパート向けのTips:

* Python インタプリタを "-O" フラグ付きで起動すると、最適化されたコ
  ー ドが生成されて ".pyo" ファイルに保存されます。最適化機構は今のと
  ころ あまり役に立っていません。最適化機構は "assert" 文と
  "SET_LINENO" 命 令を除去しているだけです。 "-O" を使うと、 *すべての
  * バイトコード (*bytecode*) が最適化されます。 ".pyc" ファイルは無視
  され、 ".py" フ ァイルは最適化されたバイトコードにコンパイルされます
  。

* 二つの "-O" フラグ ("-OO") を Python インタプリタへ渡すと、バイト
  コ ードコンパイラは、まれにプログラムが正しく動作しなくなるかもしれ
  ない ような最適化を実行します。現状では、ただ "__doc__" 文字列をバイ
  トコ ードから除去して、よりコンパクトな ".pyo" ファイルにするだけで
  す。こ の文字列が利用できることをあてにしているプログラムがあるかも
  しれない ので、自分の行っている操作が何かわかっているときにだけこの
  オプション を使うべきです。

* ".pyc" ファイルや ".pyo" ファイルから読み出されたとしても、プログ
  ラ ムは ".py" ファイルから読み出されたときより何ら高速に動作するわけ
  で はありません。 ".pyc" ファイルや ".pyo" ファイルで高速化されるの
  は、 読み込まれるときの速度だけです。

* スクリプトの名前をコマンドラインで指定して実行した場合、そのスクリ
  プ トのバイトコードが ".pyc" や ".pyo" に書き出されることはありませ
  ん。 従って、スクリプトのほとんどのコードをモジュールに移し、そのモ
  ジュー ルを import する小さなブートストラップスクリプトを作れば、ス
  クリプト の起動時間を短縮できるときがあります。 ".pyc" または ".pyo"
  ファイル の名前を直接コマンドラインに指定することもできます。

* 一つのモジュールについて、ファイル "spam.py" のない "spam.pyc"
  ("-O" を使ったときは "spam.pyo") があってもかまいません。この仕様は
  、 Python コードでできたライブラリをリバースエンジニアリングがやや困
  難 な形式で配布するために使えます。

* "compileall" は、 ".pyc" ファイル (または "-O" を使ったときは
  ".pyo" ファイル) をディレクトリ内の全てのモジュールに対して生成する
  ことがで きます。


6.2. 標準モジュール
===================

Python は標準モジュールライブラリを同梱していて、別の Python ライブラ
リリファレンスというドキュメントで解説しています。幾つかのモジュールは
言語のコアにはアクセスしないものの、効率や、システムコールなどOSの機能
を利用するために、インタープリター内部にビルトインされています。そうい
ったモジュールセットはまたプラットフォームに依存した構成オプションです
。例えば、 "winreg" モジュールは Windows システムでのみ提供されていま
す。 1つ注目に値するモジュールとして、 "sys" モジュールは、全ての
Python インタープリターにビルトインされています。 "sys.ps1" と
"sys.ps2" という変数は一次プロンプトと二次プロンプトに表示する文字列を
定義しています:

   >>> import sys
   >>> sys.ps1
   '>>> '
   >>> sys.ps2
   '... '
   >>> sys.ps1 = 'C> '
   C> print 'Yuck!'
   Yuck!
   C>

これらの二つの変数は、インタプリタが対話モードにあるときだけ定義されて
います。

変数 "sys.path" は文字列からなるリストで、インタプリタがモジュールを検
索するときのパスを決定します。 "sys.path" は環境変数 "PYTHONPATH" から
得たデフォルトパスに、 "PYTHONPATH" が設定されていなければ組み込みのデ
フォルト値に設定されます。標準的なリスト操作で変更することができます:

   >>> import sys
   >>> sys.path.append('/ufs/guido/lib/python')


6.3. "dir()" 関数
=================

組込み関数 "dir()" は、あるモジュールがどんな名前を定義しているか調べ
るために使われます。 "dir()" はソートされた文字列のリストを返します:

   >>> import fibo, sys
   >>> dir(fibo)
   ['__name__', 'fib', 'fib2']
   >>> dir(sys)  
   ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__',
    '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache',
    '_current_frames', '_getframe', '_mercurial', 'api_version', 'argv',
    'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
    'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info',
    'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix',
    'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
    'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
    'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
    'getrefcount', 'getsizeof', 'gettotalrefcount', 'gettrace', 'hexversion',
    'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules',
    'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
    'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile',
    'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion',
    'version', 'version_info', 'warnoptions']

引数がなければ、 "dir()" は現在定義している名前を列挙します:

   >>> a = [1, 2, 3, 4, 5]
   >>> import fibo
   >>> fib = fibo.fib
   >>> dir()
   ['__builtins__', '__name__', '__package__', 'a', 'fib', 'fibo', 'sys']

変数、モジュール、関数、その他の、すべての種類の名前をリストすることに
注意してください。

"dir()" は、組込みの関数や変数の名前はリストしません。これらの名前から
なるリストが必要なら、標準モジュール "__builtin__" で定義されています:

   >>> import __builtin__
   >>> dir(__builtin__)  
   ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
    'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError',
    'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError',
    'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning',
    'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',
    'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented',
    'NotImplementedError', 'OSError', 'OverflowError',
    'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',
    'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
    'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True',
    'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
    'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
    'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',
    'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__',
    '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring',
    'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr',
    'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright',
    'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',
    'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset',
    'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input',
    'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license',
    'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next',
    'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit',
    'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round',
    'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
    'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']


6.4. パッケージ
===============

パッケージ (package) は、Python のモジュール名前空間を "ドット付きモジ
ュール名" を使って構造化する手段です。例えば、モジュール名 "A.B" は、
"A" というパッケージのサブモジュール "B" を表します。ちょうど、モジュ
ールを利用すると、別々のモジュールの著者が互いのグローバル変数名につい
て心配しなくても済むようになるのと同じように、ドット付きモジュール名を
利用すると、 NumPy や Pillow のように複数モジュールからなるパッケージ
の著者が、互いのモジュール名について心配しなくても済むようになります。

音声ファイルや音声データを一様に扱うためのモジュールのコレクション ("
パッケージ") を設計したいと仮定しましょう。 音声ファイルには多くの異な
った形式がある (通常は拡張子、 例えば ".wav", ".aiff", ".au" などで認
識されます) ので、増え続ける様々なファイル形式を相互変換するモジュール
を、 作成したりメンテナンスしたりする必要があるかもしれません。 また、
音声データに対して実行したい様々な独自の操作 (ミキシング、 エコーの追
加、 イコライザ関数の適用、 人工的なステレオ効果の作成など) があるかも
しれません。 そうなると、 こうした操作を実行するモジュールを果てしなく
書くことになるでしょう。 以下に (階層的なファイルシステムで表現した)
パッケージの構造案を示します:

   sound/                          Top-level package
         __init__.py               Initialize the sound package
         formats/                  Subpackage for file format conversions
                 __init__.py
                 wavread.py
                 wavwrite.py
                 aiffread.py
                 aiffwrite.py
                 auread.py
                 auwrite.py
                 ...
         effects/                  Subpackage for sound effects
                 __init__.py
                 echo.py
                 surround.py
                 reverse.py
                 ...
         filters/                  Subpackage for filters
                 __init__.py
                 equalizer.py
                 vocoder.py
                 karaoke.py
                 ...

パッケージを import する際、 Python は "sys.path" 上のディレクトリを検
索して、トップレベルのパッケージの入ったサブディレクトリを探します。

あるディレクトリを、パッケージが入ったディレクトリとしてPython に扱わ
せるには、ファイル "__init__.py" が必要です。このファイルを置かなけれ
ばならないのは、 "string" のようなよくある名前のディレクトリにより、モ
ジュール検索パスの後の方で見つかる正しいモジュールが意図せず隠蔽されて
しまうのを防ぐためです。最も簡単なケースでは "__init__.py" はただの空
ファイルで構いませんが、 "__init__.py" ではパッケージのための初期化コ
ードを実行したり、後述の "__all__" 変数を設定してもかまいません。

パッケージのユーザは、個々のモジュールをパッケージから import すること
ができます。例えば:

   import sound.effects.echo

この操作はサブモジュール "sound.effects.echo" をロードします。このモジ
ュールは、以下のように完全な名前で参照しなければなりません。

   sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

サブモジュールを import するもう一つの方法を示します:

   from sound.effects import echo

これもサブモジュール "echo" をロードし、 "echo" をパッケージ名を表す接
頭辞なしで利用できるようにします。従って以下のように用いることができま
す:

   echo.echofilter(input, output, delay=0.7, atten=4)

さらにもう一つのバリエーションとして、必要な関数や変数を直接 import す
る方法があります:

   from sound.effects.echo import echofilter

この操作も同様にサブモジュール "echo" をロードしますが、
"echofilter()" を直接利用できるようにします:

   echofilter(input, output, delay=0.7, atten=4)

"from package import item" を使う場合、 *item* はパッケージ *package*
のサブモジュール (またはサブパッケージ) でもかまいませんし、関数やクラ
ス、変数のような、 *package* で定義されている別の名前でもかまわないこ
とに注意してください。 "import" 文はまず、 *item* がパッケージ内で定義
されているかどうか調べます。定義されていなければ、 *item* はモジュール
名であると仮定して、モジュールをロードしようと試みます。もしモジュール
が見つからなければ、 "ImportError" が送出されます。

反対に、 "import item.subitem.subsubitem" のような構文を使った場合、最
後の "subsubitem" を除く各要素はパッケージでなければなりません。最後の
要素はモジュールかパッケージにできますが、一つ前の要素で定義されている
クラスや関数や変数にはできません。


6.4.1. パッケージから * を import する
--------------------------------------

それでは、ユーザが "from sound.effects import *" と書いたら、どうなる
のでしょうか？理想的には、何らかの方法でファイルシステムが調べられ、そ
のパッケージにどんなサブモジュールがあるかを調べ上げ、全てを import す
る、という処理を望むことでしょう。これには長い時間がかかってしまうこと
もありますし、あるサブモジュールを import することで、そのモジュールが
明示的に import されたときのみ発生して欲しい副作用が起きてしまうかもし
れません。

唯一の解決策は、パッケージの作者にパッケージの索引を明示的に提供させる
というものです。 "import" 文の使う規約は、パッケージの "__init__.py"
コードに "__all__" という名前のリストが定義されていれば、 "from
package import *" が現れたときに import すべきモジュール名のリストとし
て使う、というものです。 パッケージの新バージョンがリリースされるとき
にリストを最新の状態に更新するのは パッケージの作者の責任となります。
自分のパッケージから * を import するという使い方が考えられないならば
、 パッケージの作者はこの使い方をサポートしないことにしてもかまいませ
ん。 例えば、ファイル "sound/effects/__init__.py" には、次のような コ
ードを入れてもよいかもしれません:

   __all__ = ["echo", "surround", "reverse"]

この例では、 "from sound.effects import *" とすると、 "sound" パッケー
ジから指定された 3つのサブモジュールが import されることになっている、
ということを意味します。

もしも "__all__" が定義されていなければ、実行文 "from sound.effects
import *" は、パッケージ "sound.effects" の全てのサブモジュールを現在
の名前空間の中へ import *しません* 。この文は単に(場合によっては初期化
コード "__init__.py" を実行して) パッケージ "sound.effects" が import
されたということを確認し、そのパッケージで定義されている名前を全て
import するだけです。 import される名前には、 "__init__.py" で定義され
た名前 (と、明示的にロードされたサブモジュール) が含まれます。パッケー
ジのサブモジュールで、以前の "import" 文で明示的にロードされたものも含
みます。以下のコードを考えてください:

   import sound.effects.echo
   import sound.effects.surround
   from sound.effects import *

上の例では、 "echo" と "surround" モジュールが現在の名前空間に import
されます。これらのモジュールは "from...import" 文が実行された際に
"sound.effects" 内で定義されているからです。 (この機構は "__all__" が
定義されているときにも働きます。)

特定のモジュールでは "import *" を使ったときに、特定のパターンに従った
名前のみを公開 (export) するように設計されてはいますが、それでもやはり
製品のコードでは良いことではないと考えます。

"from package import specific_submodule" を使っても何も問題はないこと
に留意してください！実際この表記法は、import を行うモジュールが他のパ
ッケージと同じ名前を持つサブモジュールを使わなければならない場合を除い
て推奨される方式です。


6.4.2. パッケージ内参照
-----------------------

サブモジュール同士で互いに参照を行う必要がしばしば起こります。例えば、
"surround" モジュールは "echo" モジュールを使うかもしれません。このよ
うな参照はよくあることなので、 "import" 文を実行すると、まず最初に
import 文の入っているパッケージを検索し、その後になって標準のモジュー
ル検索パスを見に行きます。なので、 "surround" モジュールは単に "import
echo" や "from echo import echofilter" を使うことができます。 import
されたモジュールが現在のパッケージ(現在のモジュールをサブモジュールに
しているパッケージ) 内に見つからなかった場合、 "import" 文は指定した名
前のトップレベルのモジュールを検索します。

パッケージが (前述の例の "sound" パッケージのように) サブパッケージの
集まりに構造化されている場合、絶対 import を使って兄弟関係にあるパッケ
ージを参照できます。例えば、モジュール "sound.filters.vocoder" で
"sound.effects" パッケージの "echo" モジュールを使いたいとすると、
"from sound.effects import echo" を使うことができます。

Python 2.5 からは、上で説明した暗黙の相対importに加えて、明示的な相対
importを "from module import name" の形式の import 文で利用できます。
この明示的な相対 import では、先頭のドットで現在および親パッケージを指
定します。 "surround" モジュールの例では、以下のように記述できます。

   from . import echo
   from .. import formats
   from ..filters import equalizer

明示的であってもそうでなくても、相対 import は現在のモジュール名をベー
スにすることに注意してください。メインモジュールの名前は常に
""__main__"" なので、 Python アプリケーションのメインモジュールとして
利用されることを意図しているモジュールでは絶対 import を利用するべきで
す。


6.4.3. 複数ディレクトリ中のパッケージ
-------------------------------------

パッケージはもう一つ特別な属性として "__path__" をサポートしています。
この属性は、パッケージの "__init__.py" 中のコードが実行されるよりも前
に、 "__init__.py" の収められているディレクトリ名の入ったリストになる
よう初期化されます。この変数は変更することができます。変更を加えると、
以降そのパッケージに入っているモジュールやサブパッケージの検索に影響し
ます。

この機能はほとんど必要にはならないのですが、パッケージ内存在するモジュ
ール群を拡張するために使うことができます。

-[ 注記 ]-

[1] 実際には、関数定義も '実行' される '文' です。モジュールレベル
    の関 数定義を実行すると、関数名はモジュールのグローバルなシンボル
    テーブ ルに入ります。
