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