それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

モジュールをパッケージ化する

今度は、パッケージの作成方法

まず、パッケージとはモジュールの集合体。Pythonにおいて、以下のことが成立する

ディレクトリ構造 = パッケージ階層
ファイル名       = モジュール名

じゃぁパッケージ全体の設定はどうするんだ? __init_.py ファイルを設置する。(省略可)

#ディレクトリ構造
./Amazon
   +- __init_.py
   +- AWS_Actount.py
   /products
       + __init__.py
       +-- /Book
       |     +-- __init__.py
       +--/Video
             +-- __init__.py

などと__init__.pyが沢山出来ますよ。__init__.pyがあることでディレクトリがパッケージとして認知される。

パッケージ内の特定モジュールをLoadする。

これはJavaと同じ発想で良い。

//Java
import java.io.*;
import java.util.Hashtable;
import java.util.Properties;

#Python
import Amazon.products
import Video from Amazon

ここで、注釈: import X from のこと

//Javaだと
import java.io.*;
import java.util.Hashtable;
import java.util.Properties;

java.utilを何度も書く。これが面倒だろ?
Pythonでは、Fromを使うことでSimpleにしている
javaを題材に例を作ると

#python

import java.io.* 
from java.util import Hashtable, Properties 
#    ^^^^^^^^^        ^^^^^^^^^^^^^^^^^^^^^
#    共通部分                タプル

このシンプルな記法がPythonの特徴さ。

パッケージの銘々規則

変数名や関数名と同じ。ファイル名は[名前.py]と書く。 正規表現で書くと

           [a-Z][a-Z0-9_]* 
    または [a-zA-Z][a-zA-Z_0-9]*
    または (\l\s)(\w)

windowsはcase insensitiveだぞ?

Windows は大文字小文字を区別しないので、[名前.py]では不便なことが出てきそうですね?Windows95系には、ファイル名の文字数制限がある。*1

安全のために、パッケージの初期ロード(__init__.py)に内包するモジュール名を定義しておく。__all__ 変数を使う。

# ./sample/__init__.py
__all__ = ["hoge", "FOO", "Bar"]

と書いておけば

from sample import *;

と全指定したときに __all__の中身で指定した「大文字小文字」でパッケージが読み込まれる。ファイル名を無視するようだ。

*1:win98を現役で使ってる開発者なんていないだろうけど