【问题标题】:What is Python implicit relative import什么是 Python 隐式相对导入
【发布时间】:2018-07-20 21:06:57
【问题描述】:

PEP 8 -- Style Guide for Python Code

显式相对导入是绝对导入的可接受替代方案

不应使用隐式相对导入,并且已在 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'>

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

【问题讨论】:

  • 您从 PEP8 中引用的内容是建议的方法,未采用

标签: python


【解决方案1】:

当你说:

import foo

Python 2 会首先在调用者的目录中查找。 Python 3 不会这样做,只会在sys.pathPYTHONPATHsite-packages 等)等常用位置找到foo

这意味着如果你正在编写一个支持 Python 3 的包,你应该在你的包中这样说:

import mypkg.foo

或者使用显式的相对导入:

from . import foo

【讨论】:

  • 这个答案掩盖了这样一个事实,即在运行脚本时,Python 3 仍然可以解析导入,因为脚本目录已添加到“常用位置”(它将是 @987654328 中的第一个条目@)。
【解决方案2】:

在 python3 中,你的代码只有在 python3 将你调用的 python 模块的父目录添加到 sys.path 时才有效

如果您使用子模块并使用子模块的隐式相对导入,它将不起作用。

mkdir -p smod
touch smod/csv.py
echo 'import csv; print(csv)' > smod/__init__.py
python3 -c 'import smod; print(smod)'
<module 'csv' from '</path/to>/lib/python3.9/csv.py'>
<module 'smod' from '/<home>/test/smod/__init__.py'>

【讨论】:

    猜你喜欢
    • 2014-01-09
    • 2018-06-26
    • 2014-04-30
    • 2014-05-05
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多