等价于Python3中的相对导入

时间:2018-10-02 22:54:37

标签: python python-3.x

在Python3中,不幸的决定是删除相对导入的功能。我目前正在现代化大量使用此功能的大量Python2代码。

所以,现在,我的代码具有以下作用:

import other_function
import another_class_file
...
foo = other_function.calculate_foo() + other_function.constant
bar = another_class_file.Bar(foo)

据我所知,在Python3中执行此操作的“正确”方法是:

from other_function import foo as calculate_foo
from other_function import constant
from another_class_file import Bar
....
foo = calculate_foo() + constant
bar = Bar(foo)

但是这种方式感觉非常肮脏:与其总是始终不确切知道函数或类的来源,还只是将其扔到顶层,这是知道某物从何而来的唯一方法通过查看顶部的import语句列表。总的来说,代码变得更加模棱两可。显式胜于隐式。

有什么办法可以实现相同的符号,类似于from other_function import foo as other_function.calculate_foo?我不想手动将这些名称命名为匈牙利风格。

1 个答案:

答案 0 :(得分:5)

相对导入在Python 3中仍然存在。即使已将其删除,您的第二个代码段也无法解决该问题。看起来您已经对真正的相对进口感到困惑。

相对导入是指程序包中的代码-例如,在程序包pkg.mod的{​​{1}}子模块中-导入同一程序包的其他内容,而无需重复pkg部分。在Python 2上,如果pkg要导入pkg.mod,则可以

pkg.mod2

这是隐式相对导入。这些存在很多歧义性问题,因此引入了 explicit 相对导入语法:

import mod2

在Python 3上,已禁用隐式相对导入语法,而支持显式语法。在Python 2上,隐式相对导入语法仍然存在,但是强烈建议使用显式语法,并且可以使用from . import mod2 禁用隐式语法。


您的代码似乎没有使用包或任何相对的导入方式。您应该能够继续使用以前使用的相同导入语法。

如果from __future__ import absolute_importother_function是包中的同级子模块,则必须进行语法更改

another_class_file