Python中意外的相对导入行为
今天我遇到了一个非常令人惊讶的相对导入行为(不幸的是,在我拔了将近4个小时的头发之后) 我一直认为,如果在名为“package”的包中的模块名“module_A.py”中有“Class A”,则可以等效使用:Python中意外的相对导入行为,python,python-import,Python,Python Import,今天我遇到了一个非常令人惊讶的相对导入行为(不幸的是,在我拔了将近4个小时的头发之后) 我一直认为,如果在名为“package”的包中的模块名“module_A.py”中有“Class A”,则可以等效使用: from package.module_a import ClassA 或 只要您是从“包”中的模块导入。我理解这是一个相对重要的问题 直到今天,当我需要对照类a检查对象的实例时,我才发现一个非常不寻常的行为 考虑以下几点: 包装/模块a.py 包/模块_b.py 现在,当执行模块_b.
from package.module_a import ClassA
或
只要您是从“包”中的模块导入。我理解这是一个相对重要的问题
直到今天,当我需要对照类a检查对象的实例时,我才发现一个非常不寻常的行为
考虑以下几点:
包装/模块a.py
包/模块_b.py
现在,当执行模块_b.py时,您会得到:
from module_a
-------------
class is: <class 'module_a.ClassA'>
object is <class 'package.module_a.ClassA'>
is obj a ClassA: False
from module_b
-------------
class is: <class 'package.module_a.ClassA'>
object is <class 'package.module_a.ClassA'>
is obj a ClassA: True
来自模块a的
-------------
课程为:
对象是
obj是ClassA:错误
来自模块_b
-------------
课程为:
对象是
obj是ClassA吗
我已经遵循了逻辑,现在明白了为什么会发生这种情况了——这并不明显,因为我假设ClassA的绑定是相同的,无论是绝对导入还是相对导入。这给我带来了一个非常讨厌的bug,很难分离出来
我的问题是:
由于隐式相对导入导致了问题,因此在Python3中已将其删除。你通常不会得到他们期望的行为。请参阅以进行讨论。如果使用与基本(库存)模块相同的名称定义子包名称,则尤其如此 (1)是的,这是预期的行为 (2) 需要显式的相对导入
from .module_a import ClassA
,而不是
from module_a import ClassA
它可以是相对的,也可以是绝对的,并且会在顶级包和模块之间产生冲突
(3) 是的,这是相对进口的优势之一。主要的好处可能是必须少键入:)是的-我明白你的相对和/或绝对观点。看起来像是危险地带。我认为这就是为什么Keith在下面指出隐式relative已经从Python3中消失了。谢谢。我不得不承认,我并不完全了解隐式相对与显式相对。谢谢
from module_a
-------------
class is: <class 'module_a.ClassA'>
object is <class 'package.module_a.ClassA'>
is obj a ClassA: False
from module_b
-------------
class is: <class 'package.module_a.ClassA'>
object is <class 'package.module_a.ClassA'>
is obj a ClassA: True
from .module_a import ClassA
from module_a import ClassA