Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3中相对导入的等效项_Python_Python 3.x - Fatal编程技术网

Python3中相对导入的等效项

Python3中相对导入的等效项,python,python-3.x,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中实现这一点的“正确”方

在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语句列表。总的来说,代码因此变得更加模糊;显式比隐式好


是否有任何方法可以实现相同的表示法,类似于从其他函数导入foo作为其他函数的
。计算\u foo
?我不想手动将这些东西命名为匈牙利风格。

Python 3中仍然存在相对导入。即使它们已被删除,您的第二个代码段也无法解决问题。看起来你对什么是相对进口感到非常困惑

相对导入是指当包内的代码(例如,在包的
pkg.mod
子模块
pkg
)导入同一包的其他内容时,无需重复
pkg
部分。在Python2上,如果
pkg.mod
想要导入
pkg.mod2
,它可以这样做

import mod2
这是一个隐含的相对重要性。它们有很多歧义问题,因此引入了显式相对导入语法:

from . import mod2
在Python3上,隐式相对导入语法被禁用,取而代之的是显式语法。在Python2上,隐式相对导入语法仍然存在,但显式语法是首选语法,并且隐式语法可以使用来自未来导入绝对导入的
禁用


看起来您的代码没有使用包或任何类型的相对导入。您应该能够继续使用以前使用的相同导入语法

如果
other_function
other_class_file
是包内的同级子模块,则需要进行必要的语法更改

from . import other_function
from . import another_class_file

Python3中仍然存在相对导入。即使它们已被删除,您的第二个代码段也无法解决问题。看起来你对什么是相对进口感到非常困惑

相对导入是指当包内的代码(例如,在包的
pkg.mod
子模块
pkg
)导入同一包的其他内容时,无需重复
pkg
部分。在Python2上,如果
pkg.mod
想要导入
pkg.mod2
,它可以这样做

import mod2
这是一个隐含的相对重要性。它们有很多歧义问题,因此引入了显式相对导入语法:

from . import mod2
在Python3上,隐式相对导入语法被禁用,取而代之的是显式语法。在Python2上,隐式相对导入语法仍然存在,但显式语法是首选语法,并且隐式语法可以使用来自未来导入绝对导入的
禁用


看起来您的代码没有使用包或任何类型的相对导入。您应该能够继续使用以前使用的相同导入语法

如果
other_function
other_class_file
是包内的同级子模块,则需要进行必要的语法更改

from . import other_function
from . import another_class_file

这在我的情况下不起作用。如果
other_function.py
other_class_file.py
与主脚本位于同一目录中,则如果我尝试从中执行
,Python将引发导入错误。导入其他\u函数、其他\u类\u文件
。有什么明显的地方我遗漏了吗?@AmphotericLewisAcid:就像我说的,你的代码似乎没有使用包或任何类型的相对导入。(位于同一目录中的两个文件并不意味着它们打包子模块,也不意味着它们需要使用相对导入来访问彼此。)无论您最初遇到什么问题,这听起来都与相对导入无关。我完全明白发生了什么。我的IDE将其突出显示为代码中断错误,因为这些文件不是模块。但代码本身运行良好。我将保留足够长的时间让您看到,然后我将删除该问题,以避免更多不需要的问题污染论坛。听起来您可能需要重新组织或重新分类IDE中的文件。这在我的情况下不起作用。如果
other_function.py
other_class_file.py
与主脚本位于同一目录中,则如果我尝试从中执行
,Python将引发导入错误。导入其他\u函数、其他\u类\u文件
。有什么明显的地方我遗漏了吗?@AmphotericLewisAcid:就像我说的,你的代码似乎没有使用包或任何类型的相对导入。(位于同一目录中的两个文件并不意味着它们打包子模块,也不意味着它们需要使用相对导入来访问彼此。)无论您最初遇到什么问题,这听起来都与相对导入无关。我完全明白发生了什么。我的IDE将其突出显示为代码中断错误,因为这些文件不是模块。但代码本身运行良好。我将把这个问题保留足够长的时间,让你看到它,然后我将删除这个问题,以避免更多不需要的问题污染论坛。听起来你可能需要重新组织或重新分类IDE中的文件。