2012-07-12

使用側から見た Python の import

以前、「Septième Sens: Pythonのimport」で Python の import について技術的な説明をしたが、それを読んでも import 文をどのように書いたらいいのかはよく分からない。そこで今回は、使用側から見た import 文について少し書いてみようと思う。

まず、私がたびたび陥る錯覚であるが、

import p

としたときに、p (パッケージ = __init__.py を持つディレクトリ) の直下にあるモジュールが全部見えるようになる、と思い込んでしまうということがある。

p/
|- __init__.py
|- a.py
`- b.py

となっていたときに、p.a も p.b も imoprt p さえ実行すれば見えるようになる、と思ってしまうのだ。import するものがモジュール(.py ファイル)なら、そのファイル内で定義されたトップレベルの関数やクラスは自動的に全部見えるようになる。だがパッケージは明示的に __init__.py で書かない限り配下のモジュールを見えるようにはしてくれない。

単純な事実だが、これが身につかないのは __init__.py でご親切に配下のモジュールについてたくさん見えるようにしてくださるパッケージが多いからである。例えば os.path.join() が使いたいと思ったときに、うっかり、

import os

と書いてしまったとしよう。ところがこの import 文の実行で os.path.join() が使えるようになるのだ(これは親切心からだけではなく、os.path として OS 環境別に別なモジュールを読み込むようになっているという事情もある)。

混乱しないようにするためには以下の手順に従えばよい:

  • p/q/r/m.py にある f() を利用したい場合:
  • p.q.r.m.f() として利用したいときには import p.q.r.m を実行する。
  • m.f() として利用したいときには from p.q.r import m を実行する。
  • f() として利用したいときには from p.q.r.m import f を実行する。
  • q.r.m.f() や r.m.f() として利用したいと考えてはいけない(単純な書き方は無い)。

0 件のコメント:

コメントを投稿