Posso usar __init__.py para definir variáveis globais?
-
21-09-2019 - |
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.
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