kuroの覚え書き

96の個人的覚え書き

相対インポート

ここまで、あえて避けてきたのだが、あちこちのサイトで紹介されているコードを組み合わせようとすると、人によってディレクトリの構成やネーミングにばらつきがあったりで、部分的にコピーしてもうまく動かないことが多い。

なので、自分の構築している環境に合わせて書き換えていく必要があるわけで、そうすると相対インポートを避けてはいられない。

たとえば

database/
    manage.py
    app/
        static/
        template/
        views/
            __init__.py
            home.py
            exome.py
        __init__.py
        config.py
        models.py

現在こんな構成になっているが
app/views/exome.pyの中には絶対パス

from app.models import User, Exome

となっているが
models.pyはapp/views/exome.pyより一つ上の階層のディレクトリ(app/)にあるため

from ..models import User, Exome

と書くことができる。
これがちょっと前の構成のようにmodels.pyとexome.pyが同じディレクトリ内にある場合には

from .models import User, Exome

で良かったわけだ。
unixのコマンドでディレクトリ階層を指定するときに、同階層で./hogeというふうに書くのと似ている。
ただし./は省略できるがpythonのimportでは.は省略できないので注意が必要だ。
じゃあ

from .. import app

これは何?
この場合一つ上の階層にある__init__.pyに定義されたappをimportしていると考えられる。もしくは一つ上の階層にapp.pyがあるか。


参考
https://www.python.org/dev/peps/pep-0328/#guido-s-decision