LoginSignup
0
2

More than 5 years have passed since last update.

【Python3基礎】同じモジュール内のファイルを呼ぶときはfrom <相対パス> import <ファイル名>じゃないとダメ

Posted at

はじめに結論

以下の構成のPythonプロジェクトがあるとします。

├── module1
│   ├── __init__.py
│   ├── filename.py
│   └── program.py
├── main.py

このとき、Pythonモジュール内のプログラムprogram.pyが同モジュール内のfilename.pyを呼び出したいとき

program.py
# import filename # “ImportError: No module named” のエラーが出る ①
# import .filename # SyntaxError: invalid syntax のエラーが出る ②

from . import filename # 正解

上記のようにPython3以降では、from . import filenameとする必要があります。

① 絶対パス読み込みではダメな理由

こちらの開発者用公式ガイドに経緯を含めて記述されています。

はじめの要約として

Imports can be ambiguous in the face of packages; within a package, it's not clear whether import foo refers to a module within the package or some module outside the package. (More precisely, a local module or package can shadow another hanging directly off sys.path.)

と理由が端的に説明されています。
つまり、Pythonのモジュールにとって自身内のファイルはsys.pathのパススコープとは別扱いなので、import filenameとするとそのfilenameが、自身の外にある別パッケージにあるもの(sys.path内にあるもの)なのか、自身内のパッケージにあるファイル名なのか、が曖昧なのです。
そのため、Pythonコミュニティのメンバーたちは議論の結果、上述の方針を取ることにしたとのことです。

② 相対パス読み込みがimport .filenameではダメな理由

こちらの記載によると、

The reason import .foo is prohibited is because after
import XXX.YYY.ZZZ
then
XXX.YYY.ZZZ
is usable in an expression. But
.moduleY
is not usable in an expression.

とあります。
つまり、絶対パス指定では、その後の式(expression)内でそのままの表現で利用できるようにするのがPython3での仕様なので、相対パスだとそれができないから、という理由のことのようです。

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2