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

Posted

技术标签:

【中文标题】如何使用标准库包名称解决 Python 包中的命名空间冲突?【英文标题】:How do I resolve namespace conflicts in my Python packages with standard library package names? 【发布时间】:2011-11-17 03:41:27 【问题描述】:

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

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 模块相同的名称”似乎……嗯……对我来说是个矿坑。这是一个移动的目标,标准模块集,随着时间的推移必然会发生变化和增长。因此,除非您的名字真正很有创意,否则 rename-things-until-you-find-something-that-doesn't-conflict 解决方案对我来说似乎很糟糕。此外,我已经用foo 将它放在了一个独特的包名中(我没有使用foo,但它绝对是独一无二的),这还不够吗?

【问题讨论】:

【参考方案1】:

如over here所述,使用

from __future__ import absolute_import

如果需要,请使用relative imports。

【讨论】:

问题是 xml.sax 不在 my 包中。所以它的相对导入是行不通的。这实际上就是为什么它现在对我来说失败了。 Python 期望 xml.sax 与我的 foo.xml 包相关,但事实并非如此。

以上是关于如何使用标准库包名称解决 Python 包中的命名空间冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 .net 标准中的命名空间“System.Configuration”错误中不存在类型或命名空间名称“ConfigurationManager”?

具有相同名称的 Python 模块(即,在包中重用标准模块名称)

如何在 C++ 中正确使用命名空间?

如果放入命名空间包中,则子模块的python导入路径

处理 R 中冲突的命名空间(不同包中的相同函数名):重置包命名空间的优先级

如何验证XML架构中的命名约定