Я хочу определить константу, которая должна быть доступна во всех подмодулях пакета. Я думал, что лучше всего будет в __init__.py
файле корневого пакета. Но я не знаю, как это сделать. Предположим, у меня есть несколько подпакетов, каждый с несколькими модулями. Как я могу получить доступ к этой переменной из этих модулей?
Конечно, если это совершенно неправильно, и есть альтернатива лучше, я бы хотел знать об этом.
from . import MY_CONSTANT
from mypackage.constants import *
будет размещать копииMY_CONSTANT
в каждом подмодуле, а не ссылку на одну и ту же переменнуюMY_CONSTANT
какой-либо из модулей, он изменится везде. Если вы переназначаетеMY_CONSTANT
какой-либо из модулей, это повлияет только на этот модуль. Если это ваше намерение, вы должны ссылаться на атрибут, то естьmypackage.constants.MY_CONSTANT
.mymodule.py
в__init__.py
до того,MY_CONSTANT = 42
что не получится, потому что , когда импортmymodule.py
MY_CONSTANT
не был определен. Так что нужно двигатьсяMY_CONSTANT = 42
вышеimport mymodule
Вы не можете сделать это. Вам нужно будет явно импортировать свои константы в пространство имен каждого отдельного модуля. Лучший способ добиться этого - определить ваши константы в модуле "config" и импортировать их везде, где вам это нужно:
источник
sys.modules
.Вы можете определять глобальные переменные откуда угодно, но это действительно плохая идея. импортируйте
__builtin__
модуль и измените или добавьте атрибуты к этим модулям, и вдруг у вас появятся новые встроенные константы или функции. Фактически, когда мое приложение устанавливает gettext, я получаю функцию _ () во всех своих модулях, ничего не импортируя. Так что это возможно, но, конечно, только для проектов типа приложения, а не для повторно используемых пакетов или модулей.И я думаю, никто бы все равно не рекомендовал эту практику. Что не так с пространством имен? В указанном приложении есть модуль версии, поэтому у меня есть «глобальные» переменные, например
version.VERSION
,version.PACKAGE_NAME
и т. Д.источник
Просто хотел добавить, что константы можно использовать с помощью файла config.ini и анализировать в скрипте с помощью библиотеки configparser. Таким образом, у вас могут быть константы для нескольких обстоятельств. Например, если у вас были константы параметров для двух отдельных запросов URL, просто пометьте их так:
Я нашел документацию на веб-сайте 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
источник