如何解决Python包中与标准库包名的命名空间冲突?

16 投票
1 回答
15011 浏览
提问于 2025-04-17 02:17

我正在开发一个包,磁盘上的结构如下:

foo/
   __init__.py
   xml.py
   bar.py
   moo.py

这个 xml.py 包里有一个类,它用 SAX 流解析器来处理一些自定义的 XML 解析和转换,供其他包的组件使用。所以里面有:

import xml.sax
import xml.sax.handler

但是当我在应用程序中使用 foo.xml 时,我遇到了:

Traceback (most recent call last):
  File "testxmlparser.py", line 15, in <module>
    import foo.xml
  File "~/code/foo/xml.py", line 39, in <module>
    import xml.sax
ImportError: No module named sax

看起来我遇到了命名空间冲突。如果我把 xml.py 改名为其他名字,比如 xmlparser.py,一切就正常了。但我觉得这样做不太对。我感觉我对 Python 中包的命名和解析有些基本的东西没搞明白。

有没有什么合适的方法可以解决这个问题,而不需要我去改名 foo/xml.py 文件?还是说,解决命名冲突的唯一办法就是改名?

补充:我觉得“避免把东西命名为标准 Python 模块的名字”这条建议...嗯...对我来说就像是个陷阱。这是个不断变化的目标,标准模块的集合会随着时间的推移而变化和增加。所以,除非你在命名上非常有创意,否则一直改名直到找到一个不冲突的名字的办法对我来说似乎不太好。而且,我已经把它放在一个独特的包名 foo 里了(虽然我用的不是 foo,但肯定是个独特的名字),难道这还不够吗?

1 个回答

15

正如在这里提到的,可以使用

from __future__ import absolute_import

如果需要的话,可以使用相对导入

撰写回答