¿Cuál es la mejor manera de inicializar y usar constantes en las clases de Python?

Aquí es cómo estoy declarando constantes y usándolas en diferentes clases de Python:

# project/constants.py GOOD = 1 BAD = 2 AWFUL = 3 # project/question.py from constants import AWFUL, BAD, GOOD class Question: def __init__(self): ... 

¿Es lo anterior una buena manera de almacenar y usar valores de contant? Me doy cuenta de que después de un tiempo, el archivo de constantes puede ser bastante grande y podría importar explícitamente 10+ de esas constantes en cualquier archivo dado.

¿por qué no solo usar

 import constants def use_my_constants(): print constants.GOOD, constants.BAD, constants.AWFUL 

Desde el python zen:

Los espacios de nombres son buenos. ¡Vamos a hacer más de esos!

EDITAR: Excepto que, cuando haga una cita, debe incluir una referencia y verificarla, ya que, como otros han señalado, debe leer:

Los espacios de nombres son una gran idea, ¡hagamos más de ellos!

Esta vez, en realidad lo copié de la fuente: PEP 20 – El zen de Python

También tiene la opción, si las constantes están vinculadas a una clase en particular y se usan de manera privada dentro de esa clase para hacerlas específicas a esa clase:

 class Foo(object): GOOD = 0 BAD = 1 WTF = -1 def __init__(self... 

y ya te vas

Tienes pocas opciones:

  1. Hazlo como lo estás haciendo ahora mismo con un archivo de constantes.
  2. Use un archivo plano y analícelo una vez, pase un diccionario / clase
  3. Consulta a una base de datos

Desde un punto de vista general, 1 y 2 son casi iguales. En cuanto a su pregunta sobre la importación de constantes específicas, es mucho más fácil usar una de las siguientes convenciones:

  • import constants; some_func(constants.AWFUL)
  • from constants import *; some_func(AWFUL)

Intente ver los siguientes enlaces (un enlace contiene un recibo del estado activo de cómo implementar constantes reales):

Importar una larga lista de constantes a un archivo Python

¿Crear constantes usando un módulo de “configuración”?

¿Puedo evitar modificar un objeto en Python?