Me preguntaba si sería posible evitar algunas de las desventajas del uso de variables globales (véase, por ejemplo, http://wiki.c2.com/?GlobalVariablesAreBad ) mediante el uso de un espacio de nombres de clase en lugar de un espacio de nombres global / módulo para pasar valores de variables . El siguiente código indica que los dos métodos son esencialmente idénticos. Hay una ligera ventaja en el uso de espacios de nombres de clase como se explica a continuación.
Los siguientes fragmentos de código también muestran que los atributos o variables pueden crearse y eliminarse dinámicamente tanto en espacios de nombres globales / de módulo como en espacios de nombres de clase.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Llamo a este módulo 'muro' ya que se usa para rebotar variables. Actuará como un espacio para definir temporalmente variables globales y atributos de toda la clase del 'enrutador' de clase vacía.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Este módulo importa el muro y define una sola función sourcefn
que define un mensaje y lo emite mediante dos mecanismos diferentes, uno a través de las funciones globales y otro a través de la función del enrutador. Tenga en cuenta que las variables wall.msg
y wall.router.message
se definen aquí por primera vez en sus respectivos espacios de nombres.
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
Este módulo define una función destfn
que utiliza los dos mecanismos diferentes para recibir los mensajes emitidos por la fuente. Permite la posibilidad de que la variable 'msg' no exista.destfn
también elimina las variables una vez que se han mostrado.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Este módulo llama a las funciones definidas previamente en secuencia. Después de la primera llamada a dest.destfn
las variables wall.msg
y wall.router.msg
ya no existen.
La salida del programa es:
global: Hola mundo!
enrutador: ¡Hola mundo!
global: sin mensaje
enrutador: sin mensaje
Los fragmentos de código anteriores muestran que los mecanismos módulo / global y clase / clase variable son esencialmente idénticos.
Si se van a compartir muchas variables, la contaminación del espacio de nombres se puede gestionar mediante el uso de varios módulos de tipo de pared, por ejemplo, wall1, wall2, etc. o definiendo varias clases de tipo de enrutador en un solo archivo. Este último es un poco más ordenado, por lo que tal vez representa una ventaja marginal para el uso del mecanismo de variable de clase.