Quiero definir una constante que debería estar disponible en todos los submódulos de un paquete. Pensé que el mejor lugar estaría en el __init__.py
archivo del paquete raíz. Pero no sé cómo 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 está totalmente mal y hay una alternativa mejor, me gustaría saberlo.
from . import MY_CONSTANT
from mypackage.constants import *
colocará copias deMY_CONSTANT
cada submódulo en lugar de una referencia a la misma variableMY_CONSTANT
en cualquiera de los módulos, mutaría en todas partes. SiMY_CONSTANT
tuviera que reasignar alguno de los módulos, solo afectaría a ese módulo. Si esa es su intención, debe hacer referencia por atributo, es decirmypackage.constants.MY_CONSTANT
.mymodule.py
en__init__.py
antesMY_CONSTANT = 42
de que se producirá un error porque cuando la importaciónmymodule.py
MY_CONSTANT
no se ha definido todavía. Por lo tanto, debe moverseMY_CONSTANT = 42
arribaimport mymodule
Usted no puede 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 sus constantes en un módulo "config" e importarlo donde lo necesite:
fuente
sys.modules
.Puede definir variables globales desde cualquier lugar, pero es una muy mala idea. importe el
__builtin__
módulo y modifique o agregue atributos a estos módulos, y de repente tiene nuevas constantes o funciones integradas. De hecho, cuando mi aplicación instala gettext, obtengo la función _ () en todos mis módulos, sin importar nada. Entonces 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 de todos modos. ¿Qué tiene de malo un espacio de nombres? Dicha aplicación tiene el módulo de versión, de modo que tengo variables "globales" disponibles como
version.VERSION
,version.PACKAGE_NAME
etc.fuente
Solo quería agregar que las constantes pueden emplearse usando un archivo config.ini y analizarse en el script usando la biblioteca configparser. De esta manera, podría tener constantes para múltiples circunstancias. Por ejemplo, si tenía constantes de parámetro para dos solicitudes de URL separadas, simplemente etiquételas así:
La documentación en el sitio web de Python me pareció 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
fuente