Как разрешить конфликты пространства имен в моих пакетах Python с помощью имен стандартных библиотечных пакетов? - PullRequest
15 голосов
/ 14 сентября 2011

Я разрабатываю пакет со следующей структурой на диске:

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

Пакет xml.py предоставляет класс, который выполняет некоторый пользовательский синтаксический анализ и перевод XML для других компонентов пакета, используя анализатор потока SAX,Итак, в нем есть:

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 Ответ

14 голосов
/ 14 сентября 2011

Как уже упоминалось здесь , используйте

from __future__ import absolute_import

и используйте относительный импорт при необходимости.

...