如何使用标准库包名称解决 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 模块(即,在包中重用标准模块名称)