2

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

# $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 *)进行测试时,它就会消失。这是真的,还是我构建整个事情的方式有问题。

4

1 回答 1

1

您遇到了 Python 的导入怪癖之一。每个子模块都以不同的方式导入X。解决这个问题的方法是执行Xfrom .bin的相对导入,a.c而不是它当前使用的有缺陷的导入。这将限制a为一个包,但__init__.py无论如何,存在意味着这一点。

于 2013-06-15T20:59:26.180 回答