Python命名空间混乱

时间:2013-06-15 19:48:25

标签: python namespaces

我正在尝试创建一个模块,并且担心我可能做错了什么。我遇到了我的命名空间的一些问题。我做了一个很像我的例子,根据评论,它有三个带文件名的文件。

# $PYTHON_PATH/a/b.py

class X:
    pass

def make_x():
    return X()

我有一个初始文件

# $PYTHON_PATH/a/__init__.py

from b import make_x

然后我有一个文件

# $PYTHON_PATH/a/c.py

from b import X
x = X()

# For testing
if __name__ == "__main__":
    from a import *
    y = make_x()

    print x.__class__
    print y.__class__

    print isinstance(x,X)
    print isinstance(y,X)

运行c.py

时的输出
b.X
a.b.X
True
False

也许这只是从模块中导入模块的问题,并且当我没有以这种hacky方式(from a import *)进行测试时它会消失。这是真的吗,或者我是如何构建整个事情的。

1 个答案:

答案 0 :(得分:1)

你已经遇到了Python的一个导入怪癖。每个子模块都以不同的方式导入X。解决此问题的方法是从X中的.b执行a.c的相对导入,而不是当前使用的有缺陷的导入。这会将a限制为一个包,但__init__.py的存在意味着这一点。