Skip to main content
 首页 » 编程设计

Python 命名空间混淆

2025年05月04日8bluestorm

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

# $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 的存在都意味着这一点。