Creo que hay muchas circunstancias en las que tiene sentido y simplifica la programación para tener algunos valores globales conocidos en varios módulos (estrechamente acoplados).Con este espíritu, me gustaría explayarme un poco sobre la idea de tener un módulo de globales que es importado por aquellos módulos que necesitan referenciarlos.
Cuando solo hay un módulo de este tipo, lo llamo "g". En él, asigno valores por defecto para cada variable que pretendo tratar como global. En cada módulo que utiliza cualquiera de ellos, no utilizo "from g import var", ya que esto solo da como resultado una variable local que se inicializa desde g solo en el momento de la importación. Hago la mayoría de las referencias en la forma g.var y la "g". sirve como un recordatorio constante de que estoy tratando con una variable potencialmente accesible para otros módulos.
Si el valor de dicha variable global se va a utilizar con frecuencia en alguna función en un módulo, entonces esa función puede hacer una copia local: var = g.var. Sin embargo, es importante darse cuenta de que las asignaciones a var son locales, y global g.var no se puede actualizar sin hacer referencia explícitamente a g.var en una asignación.
Tenga en cuenta que también puede tener varios de estos módulos globales compartidos por diferentes subconjuntos de sus módulos para mantener las cosas un poco más controladas. La razón por la que uso nombres cortos para mis módulos globales es para evitar saturar el código demasiado con las ocurrencias de ellos. Con solo un poco de experiencia, se vuelven mnemotécnicos con solo 1 o 2 caracteres.
Todavía es posible hacer una asignación, por ejemplo, g.x cuando x no estaba ya definido en g, y un módulo diferente puede acceder a g.x. Sin embargo, aunque el intérprete lo permita, este enfoque no es tan transparente, y lo evito. Todavía existe la posibilidad de crear accidentalmente una nueva variable en g como resultado de un error tipográfico en el nombre de la variable para una tarea. Algunas veces, un examen de dir (g) es útil para descubrir cualquier nombre sorpresa que pueda haber surgido de tal accidente.
¿Alguna razón, que no te gusta esta situación? –
Por un lado, rompe las expectativas de las personas cuando están leyendo el código. "¿Qué es este símbolo 'foo' que se usa aquí? ¿Por qué no puedo ver dónde está definido?" –
También es susceptible de causar estragos si una versión futura de Python comienza a usar el nombre que usted eligió como un builtin real. – intuited