Могу ли я использовать init.py чтобы определить глобальные переменные?



Я хочу определить константу, которая должна быть доступна во всех подмодулях пакета. Я думал, что лучшее место будет в пакета root. Но я не знаю как это сделать. Предположим, у меня есть несколько подпакетов и каждый с несколькими модулями. Как я могу получить доступ к этой переменной из этих модулей?



конечно, если это совершенно неправильно, и есть лучшая альтернатива, я хотел бы это знать.

630   4  

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_NAME etc.

просто хотел добавить, что константы могут быть использованы с помощью конфигурации.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

    Ничего не найдено.