【问题标题】:different import results at different directories不同目录的导入结果不同
【发布时间】:2011-08-05 01:14:21
【问题描述】:

我有一个包 MyPak 和一个模块 MyMod。这些文件按以下方式组织:

somedir/MyPak/MyMod.py

在 MyMod.py 中只有一个名为 MyMod 的类

在目录 somedir/MyPak 中,如果我进行导入:

import MyMod

我将 MyMod 作为模块导入。

但是在目录 somedir/ 中,如果我这样做的话

from MyPak import MyMod

我将 MyMod 导入为类,而不是模块。为什么会这样?

【问题讨论】:

    标签: python


    【解决方案1】:

    这种行为表明你有一个文件:

    somedir/MyPak/__init__.py
    

    您执行以下操作:

    from MyMod import *
    

    当你 import MyPak 时,它会从 __init__.py 导入 - 同样,当你 from MyPak import something 时,它会尝试从包的命名空间中提取 - 这将在 __init__.py 内部查看

    因为您从 MyMod 中导入了 __init__.py 中的所有内容,所以现在该类是 MyPak 包的本地类,并屏蔽了 MyMod.py 文件。

    【讨论】:

    • 确实如此。我确实找到了包含from MyMod import MyMod 的文件_init_.py。但是哪个面具哪个?我认为首先执行 _init_.py (MyMod 因为一个类),然后执行代码 from MyPak import MyMod 中的 import MyMod 部分(这掩盖了先前的结果并使 MyMod 再次成为模块。
    • 忘了说谢谢 :) somedir/MyPak 目录中的其他模块怎么样?因为我也看到from MyMod2 import MyMod2from MyMod3 import MyMod3 等在 _init_.py 文件中。如果 somedir/MyPak/_init_.py 在我执行from MyPak import MyMod 时执行,那么 MyMod2、MyMod3 等是在哪里导入的?
    • 是您的第一条评论:不。 from MyPak import MyMod 行将首先尝试从MyPak/__init__.py 的命名空间导入MyMod 符号,只有失败才会尝试导入一些文件MyPak/MyMod.py。因为您已经将该符号导入MyPak 的命名空间,所以它将直接从那里导入。
    • 是您的第二条评论:它们没有被导入 :^( 您需要单独导入每个,,只需 import MyPak(或from MyPak import *,它得到了一切)。或者,你可以说from MyPak.MyMod import MyMod,然后去掉中间人!
    • 我不太明白“...尝试从 MyPak/__init__.py 的命名空间导入 MyMod 符号”的部分,但未执行 MyPak/__init__.py 中的其余行。您能否指出一些解释此问题的进一步文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多