如何使用标准库包名解析Python包中的命名空间冲突?

Ian*_* C. 16 python namespaces packages package-structuring

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

foo/
   __init__.py
   xml.py
   bar.py
   moo.py
Run Code Online (Sandbox Code Playgroud)

xml.py包提供了一个类,该类使用SAX流解析器为其他包组件执行一些自定义XML解析和转换.所以它有:

import xml.sax
import xml.sax.handler
Run Code Online (Sandbox Code Playgroud)

但是当我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
Run Code Online (Sandbox Code Playgroud)

我似乎有一个命名空间冲突.如果我重命名xml.py为其他东西,就像xmlparser.py一切按预期工作.但这感觉是错误的做法.我觉得我在这里缺少Python中包名和解析的基本内容.

有没有一种正确的方法来完成这项工作,而不涉及我重命名foo/xml.py文件?或者这真的是冲突名称的唯一解决方案吗?

编辑:"避免命名与标准Python模块相同的东西"似乎......好吧..给我一个mineshaft.这是一个移动目标,标准模块集,随着时间的推移必然会发生变化和增长.因此,除非你真正对自己的名字有所了解,否则重命名 - 事物 - 直到找到 - 某些不冲突的解决方案对我来说似乎很不好.此外,我已经用一个独特的包装名称foo(我不使用foo,但绝对是独一无二的),这应该不够吗?

Ros*_*ews 15

如前所述在这里,使用

from __future__ import absolute_import
Run Code Online (Sandbox Code Playgroud)

并在需要时使用相对导入.

  • 问题是 `xml.sax` 不在 *my* 包中。所以它的相对导入是行不通的。这实际上就是我现在失败的原因。Python 期望 `xml.sax` 与我的 `foo.xml` 包相关,但事实并非如此。 (2认同)