Pergunta

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

Foi útil?

Solução

Você deve ser capaz de colocá -los em __init__.py. Isso é feito o tempo todo.

mypackage/__init__.py:

MY_CONSTANT = 42

mypackage/mymodule.py:

from mypackage import MY_CONSTANT
print "my constant is", MY_CONSTANT

Em seguida, importe o MyModule:

>>> from mypackage import mymodule
my constant is 42

Ainda assim, se você tiver constantes, seria razoável (provavelmente as práticas recomendadas) colocá -las em um módulo separado (constants.py, config.py, ...) e então se você os quiser no espaço para nome do pacote, importe eles.

mypackage/__init__.py:

from mypackage.constants import *

Ainda assim, isso não inclui automaticamente as constantes nos namespaces dos módulos de embalagem. Cada um dos módulos no pacote ainda terá que importar constantes explicitamente de mypackage ou de mypackage.constants.

Outras dicas

Você não pode fazer isso. Você terá que importar explicitamente suas constantes para o espaço para nome de cada módulo individual. A melhor maneira de conseguir isso é definir suas constantes em um módulo "config" e importá -lo em todos os lugares que você precisar:

# mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *

Você pode definir variáveis ​​globais de qualquer lugar, mas é uma péssima ideia.importar o __builtin__ módulo e modifique ou adicione atributos a esses módulos e, de repente, você terá novas constantes ou funções integradas.Na verdade, 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 namespace?A referida aplicação possui o módulo version, para que eu tenha variáveis ​​"globais" disponíveis como version.VERSION, version.PACKAGE_NAME etc.

Só queria adicionar que as constantes possam ser empregadas usando um arquivo config.ini e analisado 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âmetros para duas solicitações de URL separadas, basta rotulá -las como assim:

mymodule/config.ini
[request0]
conn = 'admin@localhost'
pass = 'admin'
...

[request1]
conn = 'barney@localhost'
pass = 'dinosaur'
...

Achei muito útil a documentação no site do Python. Não tenho certeza se existem diferenças entre o 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top