Рефакторинг конфигурации модуля Python, чтобы избежать относительного импорта - PullRequest
3 голосов
/ 06 декабря 2008

Это относится к моему предыдущему вопросу .

Я понимаю, как хранить и читать файлы конфигурации. Есть варианты, такие как ConfigParser и ConfigObj .

Рассмотрим эту структуру для гипотетического модуля «яйца»:

eggs/
  common/
    __init__.py
    config.py
  foo/
    __init__.py
    a.py

'eggs.foo.a' требуется некоторая информация о конфигурации. То, что я сейчас делаю, в 'a',

import eggs.common.config
. Одна из проблем заключается в том, что если «а» переместится на более глубокий уровень в дереве модулей, относительный импорт прекратится. Абсолютного импорта нет, но они требуют, чтобы ваш модуль был на вашей PYTHONPATH.

Возможной альтернативой вышеуказанному абсолютному импорту является относительный импорт. Таким образом, в «а»,

import .common.config

Не обсуждая преимуществ относительного и абсолютного импорта, мне было интересно узнать о других возможных решениях?

edit- Удален контекст VCS

Ответы [ 5 ]

2 голосов
/ 06 декабря 2008

"импорт ... требует, чтобы ваш модуль был на вашей PYTHONPATH"

правый.

Итак, что не так с настройкой PYTHONPATH?

0 голосов
/ 07 декабря 2008

Вы можете обмануть механизм импорта, добавив каждый подкаталог в egg/__init__.py:

__path__.append(__path__[0]+"\\common")
__path__.append(__path__[0]+"\\foo")

тогда вы просто импортируете все модули из пространства имен egg; например import egg.bar (при условии, что у вас есть файл egg / foo / bar.py).
Обратите внимание, что foo и common не должны быть пакетом - другими словами, они не должны содержать __init__.py file.

Это решение полностью решает проблему перемещения файлов; однако оно сглаживает пространство имен и поэтому может быть не таким хорошим, особенно в больших проектах - лично я предпочитаю полное разрешение имен.

0 голосов
/ 06 декабря 2008

Как я понимаю из этого и предыдущих вопросов, вам нужен только один путь в sys.path. Если мы говорим о git как о VCS (упомянутом в предыдущем вопросе), когда только одна ветка извлечена в любое время (один рабочий каталог) Вы можете переключаться, объединять ветки так часто, как вам нравится.

0 голосов
/ 06 декабря 2008

Я думаю о чем-то вроде более «основанного на толчке» решения. Вместо того, чтобы импортировать общие объекты (будь то для настройки или каких-либо служебных функций), сделайте экспорт верхнего уровня init , а каждый промежуточный init импортируйте его из слоя выше, и немедленно реэкспортируйте это.

Я не уверен, правильно ли я понял терминологию Python, поправьте меня, если я ошибаюсь.

Таким образом, любой модуль, которому необходимо использовать общий объект (который в контексте этого примера представляет информацию о конфигурации), просто импортирует его из init на своем собственном уровне.

Это звучит разумно / осуществимо?

0 голосов
/ 06 декабря 2008

Требуется утверждение от pkg_resources Возможно, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...