Inconveniente usando 'global' dentro de 'exec'
Sebastián Lezica
slezica en fibertel.com.ar
Mie Abr 21 20:32:15 CEST 2004
Impresionante Chema!,
Casi sin tocar tu código, todo comenzó a andar de maravillas. Muy dúctil el exec como lo usaste!.
Mas allá de los errores que tenia, veo que me resta aprender a clarificar mi código; comparaba el
tuyo con el mio y el que habia hecho parecia críptico :D.
Gracias por el tiempo y la ayuda! (disculpa la demora en responder, me colgué jugando con todo esto
haciendo un webserver medio primitivo que convierte urls en objetos y funciones y me deja
actualizarlas sin cerrar la aplicacion!).
Sebastian Lezica
-----Mensaje original-----
De: python-es-bounces en aditel.org [mailto:python-es-bounces en aditel.org]En
nombre de Chema Cortes
Enviado el: Lunes, 19 de Abril del 2004 06:59
Para: La lista de python en castellano
Asunto: Re: [Python-es] Inconveniente usando 'global' dentro de 'exec'
Sebastián Lezica escribió:
> Mi problema:
> Si pongo en el exec la sentencia 'global ...' al comienzo, me da un error.
> Si la pongo luego del 'if', me da la advertencia '<string>:0: SyntaxWarning: name 'ibero' is used
> prior to global declaration' (pero funciona).
> Si no la pongo, por supuesto el modulo se recarga pero veo los cambios en la primera vuelta, al
> volver al timer se recupera el objeto 'antiguo' que era global...
La directiva "global" sólo tiene validez durante el proceso de
evaluación que hace el parser. Esto implica que la sentencia global
dentro de un exec no influirá en el código contenedor y, viceversa, que
las sentencias 'global' que tenga el código contendor no tengan ninguna
influencia en el codigo del exec, ya que ambos códigos han sido
parseados en dos momentos diferentes.
Dicho esto, deberías utilizar los argumentos adicionales que tiene la
sentencia "exec" ("sentencia", no "función" como pareces estar
utilizando). Te reescribo el código. Ya dirás si tienes algún problema
en comprenderlo (que conste que no lo he probado):
PLUGINS=[
{'alias':'ibero',
'modulo':None,
'lstat':0
}
]
codigo="""
import os
if modulo is None or \
(modulo.HOT_RELOAD and os.lstat(modulo.__file__)[-2] <> lstat):
print 'Recargando %s...'%alias
if modulo is None:
modulo=__import__('aa_%s'%alias)
else:
reload(modulo)
lstat = os.lstat(modulo.__file__)[-2]
globals()[alias]=modulo.asi() # ibero=aa_ibero.asi()
"""
for plugin in PLUGINS:
exec codigo in globals(),plugin
No sé qué me da que vas a tener problemas en la recarga. Piensa que por
cambiar el código no estás actualizando las referencias que tenías
creadas a los objetos antigüos. Mírate una de las discursiones sobre
éste tema que hemos tenido en ésta misma lista hace poco.
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es