Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Python中意外的相对导入行为_Python_Python Import - Fatal编程技术网

Python中意外的相对导入行为

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.

今天我遇到了一个非常令人惊讶的相对导入行为(不幸的是,在我拔了将近4个小时的头发之后)

我一直认为,如果在名为“package”的包中的模块名“module_A.py”中有“Class A”,则可以等效使用:

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