Python3xでは暗黙の相対importは削除


今更ながら、暗黙の相対importについて気づきました。



例。このような構成のモジュールを考えます。

spam/
  __init__.py
  egg.py
  ham.py



eggからhamをimportしようととします。

#egg.py
import ham


カレントディレクトリがspamで無い限り、Python3xではエラーになります。


D:\Owner\temp>dir /B
spam
D:\Owner\temp>C:\Python26\Python.exe -c "import spam.egg"

D:\Owner\temp>C:\Python31\Python.exe -c "import spam.egg"
Traceback (most recent call last):
  File "", line 1, in 
  File "spam\egg.py", line 1, in 
    import ham
ImportError: No module named ham

D:\Owner\temp\spam>cd spam

D:\Owner\temp\spam>C:\Python26\Python.exe -c "import egg"

D:\Owner\temp\spam>C:\Python31\Python.exe -c "import egg"



明示的相対importはこう書きます。

#egg.py
from . import ham
D:\Owner\temp>dir /B
spam
D:\Owner\temp>C:\Python26\Python.exe -c "import spam.egg"

D:\Owner\temp>C:\Python31\Python.exe -c "import spam.egg"