Eu quero definir uma constante que deve estar disponível em todos os submódulos de um pacote. Eu pensei que o melhor lugar seria no __init__.py
arquivo do pacote raiz. Mas eu não sei como fazer isso. Suponha que eu tenha alguns subpacotes e cada um com vários módulos. Como posso acessar essa variável desses módulos?
Claro, se isso estiver totalmente errado e houver uma alternativa melhor, eu gostaria de saber.
from . import MY_CONSTANT
from mypackage.constants import *
vai colocar cópiasMY_CONSTANT
em cada sub-módulo, em vez de uma referência à mesma variávelMY_CONSTANT
em qualquer um dos módulos, ele será alterado em todos os lugares. Se você fosse redesignarMY_CONSTANT
em qualquer um dos módulos, isso afetaria apenas esse módulo. Se essa é a sua intenção, você deve fazer referência por atributo, iemypackage.constants.MY_CONSTANT
.mymodule.py
em__init__.py
antesMY_CONSTANT = 42
que falhará porque ao importarmymodule.py
MY_CONSTANT
ainda não foi definido. Então, precisamos seguirMY_CONSTANT = 42
acimaimport mymodule
Você não pode fazer isso. Você precisará importar explicitamente suas constantes para o espaço de nome de cada módulo individual. A melhor maneira de conseguir isso é definir suas constantes em um módulo "config" e importá-lo para qualquer lugar que você precisar:
fonte
sys.modules
.Você pode definir variáveis globais de qualquer lugar, mas é uma péssima idéia. importe o
__builtin__
módulo e modifique ou adicione atributos a esses módulos e, de repente, você terá novas constantes ou funções internas. De fato, quando meu aplicativo instala o gettext, recebo a função _ () em todos os meus módulos, sem importar nada. Portanto, isso é possível, mas é claro, apenas para projetos do tipo Aplicativo, não para pacotes ou módulos reutilizáveis.E acho que ninguém recomendaria essa prática de qualquer maneira. O que há de errado com um espaço para nome? O aplicativo possui o módulo version, para que eu tenha variáveis "globais" disponíveis
version.VERSION
, comoversion.PACKAGE_NAME
etc.fonte
Só queria adicionar que as constantes podem ser empregadas usando um arquivo config.ini e analisadas no script usando a biblioteca configparser. Dessa forma, você pode ter constantes para várias circunstâncias. Por exemplo, se você tivesse constantes de parâmetro para duas solicitações de URL separadas, apenas as rotule da seguinte forma:
Achei a documentação no site do Python muito útil. Não tenho certeza se existem diferenças entre Python 2 e 3, então aqui estão os links para ambos:
Para Python 3: https://docs.python.org/3/library/configparser.html#module-configparser
Para Python 2: https://docs.python.org/2/library/configparser.html#module-configparser
fonte