在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
?我不想手动将这些名称命名为匈牙利风格。
答案 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_import
和other_function
是包中的同级子模块,则必须进行语法更改
another_class_file