公開Pythonチートシート:[Pythonチートシート]モジュール/例外編モジュールやパッケージのインポート、それらの作成方法、例外の捕捉と送出の基本についてギュッとまとめた。});この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。今回はこれまでに取り上げてこなかった要素のうち、モジュールとパッケージ、例外についてまとめていく。目次モジュールとパッケージのインポートモジュールでの名前の公開(エクスポート)パッケージでの名前の公開(エクスポート)例外なお、モジュールやパッケージの詳細については「Python入門」の以下の記事を参考にしてほしい。例外については同じく「Python入門」の以下を参考にしてほしい。「例外の送出と例外クラス」モジュールとパッケージのインポートモジュールやパッケージをインポートするにはimport文を使用する。その主な構文を以下に示す。以下ではモジュール名やパッケージ名を記述する際に単に「モジュール名」とだけ示すことがある。パッケージ内のサブパッケージなども含める際には「パッケージ名」と書くこともある。*モジュールやパッケージのインポート以下に例を示す。fractionsモジュールから全てをインポートモジュールやパッケージのインポートの例モジュール(やパッケージ)をインポートした場合、そこで定義されている変数や関数、クラスには「モジュール名.関数名」「モジュール名.クラス名」のようにしてアクセスする必要がある。*」形式では、そのモジュール内で定義されている全ての属性をインポートされる。この形式だと、現在の名前空間にプログラマーが関知していない多くのものを追加することになり、意図しないうちにそれらが上書きされて、プログラマーが意図したオブジェクト以外のオブジェクトを参照することになったり、どのモジュールで定義されているものかがコードを読む側にハッキリとしなかったりすることがある。そのため、この形式でのインポートは一般には推奨はされていない。モジュールでの名前の公開(エクスポート)自分でモジュールを作成する際には、基本的にはそこで定義されているもの全てが、他のモジュールに対して公開される。外部に公開したくないものを制御するには以下の2つの方法がある。公開したくないものの名前をアンダースコア「_」で始め、それが内部使用目的であることを示す__all__変数で外部に公開するものの名前を明記する。特定の名前」としてインポートすることを妨げるものではないことには注意。公開したくないものを制御する例を以下に示す。名前「foo」のみを公開することを明記アンダースコア「_」を使った命名と__all__変数によって公開するものを制御する例このコードを含んだモジュールの名前を「mymod.py」として保存し、これを利用する側でインポートする例を幾つか示す。*」する例この場合は、_bar関数は名前がアンダースコアで始まるために、baz関数は__all__変数の要素に含まれていないために、どちらも呼び出そうとするとエラー(NameError例外)が発生する。特定の名前」形式でインポートすることは可能だ。bazfoo()_bar()baz()公開したくないものでもインポートされる可能性はあるパッケージでの名前の公開(エクスポート)パッケージは一般にフォルダを使って、複数のモジュール(.pyファイル)を構造化したものになる。パッケージを作成する際にはフォルダごとに__init__.pyファイルを置く。これは空でもよいが、何らかの初期化処理を行うこともできる。ここでは以下の構造を持つパッケージを例とする。サンプルのパッケージmypkgがパッケージのトップレベルにあり、その下にサブモジュールを含んだ「module1.py」ファイルと、サブパッケージである「subpkg」フォルダがあり、その中にはサブサブモジュールを含んだ「module2.py」ファイルがある。各フォルダには__init__.pyファイルがある。module1.pyファイルのコードを以下に示す。hello():print('Hello')module1モジュールのコード(mypkg/module1.pyファイル)module2.pyファイルのコードは次の通りだ。test():print('test')module2モジュールのコード(mypkg/subpkg/module2.pyファイル)2つの__init__.pyファイルの内容はここでは空とする。この場合、利用者側では以下のようにしてパッケージ、そのサブモジュールなどをインポートできる。mypkg」としてトップレベルをインポートした場合、実際にはそのサブモジュールは利用できない(このコードはmypkgと同じ階層に例えば「test.py」のようにして置いたものとする)。AttributeError例外パッケージのトップレベルをインポートしたが、subpkgはロードされていないこれはサブモジュールやサブパッケージが実行環境にロードされ、mypkgの属性として設定されていないからだ。トップレベル(あるいはその下層レベル)をインポートしたときに、サブモジュールやサブパッケージがロードされて、「パッケージ名.サブモジュール名.関数名」のようにして利用できるようにするには、__init__.pyファイルに初期化処理を記述する。初期化処理では、サブモジュールやサブパッケージを__init__.pyファイル内部でインポートする。トップレベルの__init__.pyファイルにこれを記述した例を以下に示す。subpkgサブパッケージをロードトップレベルの__init__.pyファイルの内容(mypkg/__init__.pyファイル)こうすることで、mypkgパッケージのインポート時に、module1サブモジュールとsubpkgサブパッケージがロードされるようになる。そのため、以下のようにmodule1サブモジュールの関数を呼び出せる。AttributeError例外mypkg.module1.hello関数は呼び出せるが、mypkg.subpkg.module2.goodbye関数は呼び出せないただし、subpkgサブパッケージにあるmodule2サブモジュールはロードされていないので、そこで定義されている関数は呼び出せる例外が発生する。これにはsubpkgフォルダにある__init__.pyファイルで以下のようにモジュールをインポートすればよい。mypkg.subpkg.module2サブパッケージの__init__.pyファイルの内容(mypkg/subpkg/__init__.pyファイル)__init__.pyファイルはモジュールやパッケージのインポート時に自動的に実行されるので、mypkg/__init__.pyファイルにより、subpkgがインポートされるタイミングで、mypkg/subpkg/__init__.pyファイルも実行される。したロードの連鎖により、うまくパッケージのインポートが行えるようになっている。パッケージ内のサブモジュールやサブパッケージをトップレベルのパッケージ名から指定してインポートすることを「絶対インポート」と呼ぶ。このようにして、__init__.pyファイルに上の初期化処理を書けば、mypkgパッケージをインポートするだけで、パッケージ内で定義されたものを利用できるようになる(あるいは、トップレベルの__init__.pyファイルで今述べたことに相当するコードを記述してもよい)。*」を実行する際に、何をインポートするのかを__all__変数で指定することもできる。ここでは、例としてトップレベルの__init__.pyファイルのコードを以下のようにしてみよう。'test']書き換えた後のトップレベルの__init__.pyファイルの内容(mypkg/__init__.pyファイル)これはトップレベルで、hello関数(module1サブモジュール)とgoodbye関数、test関数(subpkg.module2サブモジュール)をインポートしている。hello」のようにしてインポートできる。*」形式のインポートではgoodbye関数はインポートされない。hello」のようなインポートの仕方を「相対インポート」と呼ぶ。モジュール/パッケージの名前の前にあるドット「.」はパッケージ内で「そのファイル(ここでは__init__.pyファイル)と同じ階層にある」ことを意味する。mypkg/__init__.pyファイルと同じ階層にはmodule1モジュール(module1.pyファイル)とsubpkgサブパッケージ(subpkgフォルダ)があるので、ここではこのように記述している。パッケージ階層が深いときには、「..」「...」のようにして上位の階層を指定していくことも可能だ。*」形式でインポートを行う例を示す。*」形式ではgoodbye関数がインポートされないこれに対して、次のコードならgoodbye関数もインポートできる。設定を有効にする必要があります。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。