我正在尝试创建一个模块,并且担心我可能做错了什么。我遇到了我的命名空间的一些问题。我做了一个很像我的例子,根据评论,它有三个带文件名的文件。
# $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 *
)进行测试时它会消失。这是真的吗,或者我是如何构建整个事情的。
答案 0 :(得分:1)
你已经遇到了Python的一个导入怪癖。每个子模块都以不同的方式导入X
。解决此问题的方法是从X
中的.b
执行a.c
的相对导入,而不是当前使用的有缺陷的导入。这会将a
限制为一个包,但__init__.py
的存在意味着这一点。