自动将Python中所有相对导入转换为绝对导入

14

我试图正确地组织我的Python 2.7项目(其中包含多个子目录)。我在每个级别上添加了__init__.py文件,在导入的情况下,似乎"最佳"做法是使用绝对导入,如下所示:

import top_package_folder.package_subfolder.module_name

改为:

import .module_name

即使我的代码位于package_subfolder目录中,也可以正常运行。

最近我了解到这一点,现在正在寻找一种自动将所有相对导入转换为绝对导入的方法。

(我尝试过autopep8,但无法使导入变成绝对导入。)

提前致谢。


你认为为什么最好使用绝对导入? - martineau
@martineau,这是一个好问题。我通过在线搜索得出了这个结论,它表明在作为包运行的项目中,绝对导入在某种程度上是“有点强制性的”,直到 Python 2.5 之后 Guido 提到不再需要,但仍然暗示相对导入仅在特定情况下有用(但没有进一步阐述)。 - petroslamb
1
顺便说一句,这是有关相对导入的最佳答案:https://dev59.com/5mYq5IYBdhLWcg3w30Tc#14132912 - petroslamb
你会发现大多数Python开发者更喜欢使用from top_package.sub_package import module_name这种方式。而import top_package_folder.package_subfolder.module_name则会让你的代码变得非常冗长。 - Anentropic
1个回答

9
你可以使用 absolufy-imports https://github.com/MarcoGorelli/absolufy-imports 来实现绝对导入。

安装

pip install absolufy-imports

作为预提交挂钩的用法

查看 pre-commit 获取说明。

示例:.pre-commit-config.yaml

-   repo: https://github.com/MarcoGorelli/absolufy-imports
    rev: v0.3.1
    hooks:
    -   id: absolufy-imports

命令行示例

$ cat mypackage/myfile.py
from . import __version__

$ absolufy-imports mypackage/myfile.py

$ cat mypackage/myfile.py
from mypackage import __version__

免责声明:本人是这个小软件包的作者


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接