モジュール

モジュールを使う理由

モジュールの基礎

次のモジュールを作る(module1.py)
def printer(x):
    print x

ファイル名

.py で終わる

利用法

>>> import module1
>>> module1.printer('Hello World!')
Hello World
>>> from module1 import printer
>>> printer('Hello World!')
Hello World!
>>> from module1 import *
>>> printer('Hello World!')
Hello World!
モジュールの名前空間を調べる.
>>> dir(module1)
['__builtins__', '__doc__', '__file__', '__name__', 'printer']
>>> module1.__dict__.keys()
['__doc__', 'printer', '__file__', '__name__', '__builtins__']
__doc__ は(時々)便利
>>> import math
>>> dir(math)
['__doc__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
>>> print math.__doc__
This module is always available.  It provides access to the
mathematical functions defined by the C standard.
>>> print math.ceil.__doc__
ceil(x)

Return the ceiling of x as a real.

名前の修飾

object.attribute (オブジェクト.属性)

インポートのモデル

インポートはただ一度だけ行なわれる

simple.py
>>> import simple
hello
>>> simple.spam
1
>>> simple.spam = 2
>>> import simple
>>> simple.spam
2
>>> reload(simple)
hello
<module 'simple' from 'C:\home\papa\lips\prog-method\simple.pyc'>
>>> simple.spam
1

importおよびfromは代入である

small.py
>>> from small import x, y
>>> x = 42
>>> y[0] = 42
>>> import small
>>> small.x
1
>>> small.y
[42, 2]

補足

モジュールのコンパイル

モジュールを import すると,一旦中間形式にコンパイルされ, コンパイルされた,バイトコードをインタプリタが実行する.
バイトコードは .pyc ファイルに残されるので,2回目の 実効では, .py と .pyc の修正日時を比較し, .py に変更が 無ければ,コンパイルを行なわずに,.pyc を実行する.

慣習としてのデータ隠蔽

Pythonではデータ隠蔽を行なう仕組みが無いが, プログラマーはモジュール内のデータを直接操作するようなことは 避けるべきである.(習慣にする)
他の OOP 言語では,Public と指定していないデータは 外部から直接操作できない.あるいは,Private宣言する.

混合モード: __name____main__

runme.py
% python
>>> import runme
>>> runme.tester('Kochi')
It's Christmas in Kochi...
>>> 
% python runme.py
It's Christmas in Heaven...
以上のように,モジュールのテストコードを末尾に付けておくことができる.

演習問題

  1. mymod.py というモジュールファイルに以下の3つの関数を作成しなさい.
  2. 上の問題で作成した mymod モジュールを対話的にテストせよ.
  3. mymod.py がスクリプトとして呼び出されたときに test 関数を実行する ように,__name__を使った文を追加せよ.また,実際に スクリプトとして実行してみよ.