明确的相对进口是绝对进口的可接受替代品
永远不应该使用隐式相对导入,并且已经在Python3中删除了.
隐式导入是一种算法
从当前包目录中搜索,直到最终包父命中.
- 来自https://www.python.org/dev/peps/pep-0328/#rationale-for-relative-imports
有人可以详细解释一下吗?
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)
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)