如何用标准库包名称解决我的Python软件包中的名称空间冲突?

发布于 2024-12-04 08:08:25 字数 966 浏览 1 评论 0原文

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

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,但绝对是唯一的东西),这不应该吗足够的?

I am developing a package with the following structure on disk:

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

The xml.py package provides a class that does some custom XML parsing and translation for the other package components using a SAX stream parser. So it has in it:

import xml.sax
import xml.sax.handler

But when I go to use foo.xml in an application I get:

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

I appear to have a namespace conflict. If I rename xml.py to something else like xmlparser.py everything works as expected. But this feels like the wrong thing to do. I feel like I'm missing something fundamental about package names and resolution in Python here.

Is there a proper way to make this work that doesn't involve me renaming the foo/xml.py file? Or is that really the only solution to the conflicting names?

Edit: The "avoid naming things the same as standard Python modules" seems...well..a mineshaft to me. That's a moving target, the standard module set, that's bound to change and grow over time. So unless you get really creative with your names the rename-things-until-you-find-something-that-doesn't-conflict solutions seems poor to me. Besides, I've got it in a unique package name with foo already (I'm not using foo, but something that is definitely unique), shouldn't that be enough?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

客…行舟 2024-12-11 08:08:25

正如此处所述,使用

from __future__ import absolute_import

并使用相对导入 if需要。

As mentioned over here, use

from __future__ import absolute_import

and use relative imports if needed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文