Ссылка на объекты в пакете? - PullRequest
1 голос
/ 03 февраля 2011

У меня есть пакет, spam, содержащий переменную _eggs в __init__.py В том же пакете, в boiler.py, у меня есть класс Boiler.

В Boiler я хочу сослаться на _eggs в файле __init__.py пакета. Есть ли способ, которым я могу это сделать?

1 Ответ

1 голос
/ 03 февраля 2011

Наиболее подходящий способ получить это значение - явный относительный импорт:

from . import _eggs

Однако следует помнить, что следующий вызов командной строки не будет работать:

python spam/boiler.py

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

python -m spam.boiler

Это дает интерпретатору достаточно информации, чтобы распознать, где boiler.py находится в иерархии модулей, и разрешить относительныйимпортирует правильно.

Это будет работать только с Python 2.6 или новее - предыдущие версии вообще не имели дело с явным относительным импортом из main .(подробности см. PEP 366 ).

Если вы просто делаете import spam.boiler из другого файла, то это должно работать для любой версии Python, которая допускает явный относительный импорт (хотя этовозможно, для Python 2.5 может потребоваться from __future__ import absolute_imports, чтобы правильно включить эту функцию)

...