Puedo usar init.py ¿definir variables globales?


Quiero definir una constante que debería estar disponible en todos los submódulos de un paquete. He pensado que el mejor lugar estaría en el archivo __init__.py del paquete raíz. Pero no se como hacer esto. Supongamos que tengo algunos subpaquetes y cada uno con varios módulos. ¿Cómo puedo acceder a esa variable desde estos módulos?

Por supuesto, si esto es totalmente incorrecto, y hay una mejor alternativa, me gustaría saberlo.

Author: pmav99, 2009-09-05

4 answers

Deberías poder ponerlos en __init__.py. Esto se hace todo el tiempo.

mypackage/__init__.py:

MY_CONSTANT = 42

mypackage/mymodule.py:

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

Luego, importa mymodule:

>>> from mypackage import mymodule
my constant is 42

Aún así, si usted tiene constantes, sería razonable (mejores prácticas, probablemente) ponerlas en un módulo separado (constants.py, config.py, ...) y luego, si los desea en el espacio de nombres del paquete, impórtelos.

mypackage/__init__.py:

from mypackage.constants import *

Aún así, esto no incluya automáticamente las constantes en los espacios de nombres de los módulos del paquete. Cada uno de los módulos del paquete tendrá que importar constantes explícitamente desde mypackage o desde mypackage.constants.

 143
Author: Jason R. Coombs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 14:18:55

No puedes hacer eso. Tendrá que importar explícitamente sus constantes en el espacio de nombres de cada módulo individual. La mejor manera de lograr esto es definir tus constantes en un módulo "config" e importarlas donde sea que lo necesites:

# mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *
 30
Author: Ferdinand Beyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-05 12:38:56

Puede definir variables globales desde cualquier lugar, pero es una muy mala idea. importe el módulo __builtin__ y modifique o agregue atributos a estos módulos, y de repente tendrá nuevas constantes o funciones incorporadas. De hecho, cuando mi aplicación instala gettext, obtengo la función _ () en todos mis módulos, sin importar nada. Así que esto es posible, pero por supuesto solo para proyectos de tipo Aplicación, no para paquetes o módulos reutilizables.

Y supongo que nadie recomendaría esta práctica Por cierto. ¿Qué tiene de malo un espacio de nombres? Dicha aplicación tiene el módulo de versión, por lo que tengo variables "globales" disponibles como version.VERSION, version.PACKAGE_NAME etc.

 2
Author: u0b34a0f6ae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-05 15:09:14

Solo quería añadir que las constantes se pueden emplear usando una configuración.archivo ini y analizado en el script usando la biblioteca configparser. De esta manera usted podría tener constantes para múltiples circunstancias. Por ejemplo, si tiene constantes de parámetros para dos solicitudes de url separadas, simplemente etiquételas de la siguiente manera:

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

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

Encontré la documentación en el sitio web de Python muy útil. No estoy seguro de si hay alguna diferencia entre Python 2 y 3, así que aquí están los enlaces a 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

 1
Author: Dan Temkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-08 21:41:23