什么是Python隐式相对导入

Sim*_*Jie 17 python

PEP 8 - Python代码风格指南中

明确的相对进口是绝对进口的可接受替代品

永远不应该使用隐式相对导入,并且已经在Python3中删除了.

什么是Python隐式相对导入?

隐式导入是一种算法

从当前包目录中搜索,直到最终包父命中.
- 来自https://www.python.org/dev/peps/pep-0328/#rationale-for-relative-imports

有人可以详细解释一下吗?

在Python3中删除了?

python2 -c 'import csv; print(csv)'
<module 'csv' from '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.pyc'>

$ touch csv.py

$ python2 -c 'import csv; print(csv)'
<module 'csv' from 'csv.pyc'>

# In python3 still search from current package
$ python3 -c 'import csv; print(csv)'
<module 'csv' from '/path_to/csv.py'>
Run Code Online (Sandbox Code Playgroud)

为什么pep-0008建议永远不要使用它?

Joh*_*nck 19

当你说:

import foo
Run Code Online (Sandbox Code Playgroud)

Python 2将首先在调用者的目录中查找.Python 3里不会那样做,只会发现foo在平常的地方,如sys.path(PYTHONPATH,site-packages,等).

这意味着如果您正在编写支持Python 3的软件包,您应该在软件包中说明:

import mypkg.foo
Run Code Online (Sandbox Code Playgroud)

或使用显式相对导入:

from . import foo
Run Code Online (Sandbox Code Playgroud)

  • 这个答案掩盖了这样一个事实:运行脚本时,Python 3 仍然可以解析导入,因为脚本目录被添加到“常用位置”(它将是 `sys.path` 中的第一个条目)。 (8认同)