Могу ли я использовать init.py чтобы определить глобальные переменные?
Я хочу определить константу, которая должна быть доступна во всех подмодулях пакета. Я думал, что лучшее место будет в пакета root. Но я не знаю как это сделать. Предположим, у меня есть несколько подпакетов и каждый с несколькими модулями. Как я могу получить доступ к этой переменной из этих модулей?
конечно, если это совершенно неправильно, и есть лучшая альтернатива, я хотел бы это знать.
4 ответов:
вы должны быть в состоянии поместить их в
__init__.py. Это делается постоянно.
mypackage/__init__.py:MY_CONSTANT = 42
mypackage/mymodule.py:from mypackage import MY_CONSTANT print "my constant is", MY_CONSTANTзатем импортируйте mymodule:
>>> from mypackage import mymodule my constant is 42тем не менее, если у вас есть константы, было бы разумно (вероятно, лучшие практики) поместить их в отдельный модуль (constants.py, config.py ...) и затем, если вы хотите, чтобы они были в пространстве имен пакета, импортируйте их.
mypackage/__init__.py:from mypackage.constants import *тем не менее, это не включает автоматически константы в пространствах имен модулей пакета. Каждый из модулей в пакете все равно придется импортировать константы явно либо из
mypackageилиmypackage.constants.
вы не можете сделать это. Вам придется явно импортировать ваши константы в пространство имен каждого отдельного модуля. Лучший способ добиться этого-определить ваши константы в модуле "config" и импортировать его везде, где вам это нужно:
# mypackage/config.py MY_CONST = 17 # mypackage/main.py from mypackage.config import *
вы можете определить глобальные переменные в любом месте, но это действительно плохая идея. импортируйте
__builtin__модуль и изменить или добавить атрибуты к этим модулям, и вдруг у вас есть новые встроенные константы или функции. На самом деле, когда мое приложение устанавливает gettext, я получаю функцию _() во всех моих модулях, не импортируя ничего. Так что это возможно, но, конечно, только для проектов прикладного типа, а не для многоразовых пакетов или модулей.и я думаю, никто не рекомендовал бы это практика во всяком случае. Что случилось с пространством имен? Указанное приложение имеет модуль версии, так что у меня есть "глобальные" переменные, доступные как
version.VERSION,version.PACKAGE_NAMEetc.
просто хотел добавить, что константы могут быть использованы с помощью конфигурации.ini файл и разбирается в скрипте с помощью библиотеки configparser. Таким образом, вы можете иметь константы для нескольких обстоятельств. Например, если у вас были константы параметров для двух отдельных url-запросов, просто обозначьте их так:
mymodule/config.ini [request0] conn = 'admin@localhost' pass = 'admin' ... [request1] conn = 'barney@localhost' pass = 'dinosaur' ...Я нашел документацию на веб-сайте Python очень полезной. Я не уверен, есть ли какие-либо различия между Python 2 и 3, поэтому вот ссылки на оба:
Для Python 3: https://docs.python.org/3/library/configparser.html#module-configparser
Для Python 2: https://docs.python.org/2/library/configparser.html#module-configparser
Comments