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

16

我正在开发一个具有以下磁盘结构的软件包:

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

2
问题在于xml.sax不在我的包中。因此,对它的相对导入无法正常工作。这实际上就是为什么它现在对我失败的原因。Python期望xml.sax相对于我的foo.xml包,但事实并非如此。 - Ian C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接