__setattr__ para locals()

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Mie Nov 28 17:38:40 CET 2007


El 28/11/07, tny <a.porrua en gmail.com> escribió:
>
> El mié, 28-11-2007 a las 00:43 -0300, Milton Galo Patricio Inostroza
> Aguilera escribió:
> ...
> >    En realidad lo que quiero hacer es trata de construir un prototipo
> > que realice debugger omnisciente a script's escritos en el lenguaje
> > python {en la universidad de chile ya han logrado construir uno para
> > java}, quizás tu sepas algo más del tema y me puedas guiar con
> > implementaciones ya realizadas...gracias por vuestra ayuda y disculpa
> > mi insistencia en el tema.
>
> Eso lo quise hacer yo una vez...
>
> http://listas.aditel.org/archivos/python-es/2007-April/017024.html
> Pepe Aracil pepe en diselpro.com
> Jue Abr 26 13:22:09 CEST 2007
> > Con execfile(...) puedes pasarle los diccionarios de globals y locals.
> >
> > ---
> > Help on built-in function execfile in module __builtin__:
> >
> > execfile(...)
> >      execfile(filename[, globals[, locals]])
> >
> >      Read and execute a Python script from a file.
> >      The globals and locals are dictionaries, defaulting to the current
> >      globals and locals.  If only globals is given, locals defaults to it.
> > (END)
> > ---
> >
> > Lo que ya no estoy tan seguro es de como reaccionará pasandole objetos "dict-like"
> > ya que puede que python utilice alguna optimización y no llame a las funciones
> > __getitem__ y demás.

Bueno tomando lo que me dijo Chema y lo que me dices tu he realizado
lo siguiente:

en el fichero Descriptor.py tengo el siguiente código:

from inspect import ismethod, getmembers

class Descriptor(object):

    def __init__(self):
        self.a = 10

    def __getattribute__(self, obj, typ=None):
        objeto = object.__getattribute__(self,obj)
        if ismethod(objeto):
            print "%s es un metodo"%obj
        else:
            print "%s debiera ser un atributo"%obj
        return objeto

    def __setattr__(self, name, value):
        print "atributo definido %s"%name
        object.__setattr__(self, name, value)

    def metodo_ejemplo(self):
        print 'soy metodo de ejemplo'
        x = 20
        print locals()

    def metodo_dos(self):
        print 'soy metodo dos'
        y = 30
        print locals()

descriptor = Descriptor()
descriptor.metodo_ejemplo()

y luego en la consola interactiva de python defino un diccionario tal
y cual me dijo chema en un correo anterior y llamo a execfile
pasandole mi diccionario como referencia al locals()...es como sigue:

>>> class MyLocals(dict):
...     def __setitem__(self, name, value):
...             dict.__setitem__(self, name, value)
...             print name, value
...
>>> local = MyLocals()
>>> execfile('Descriptor.py',globals(),local)

 la salida que me da al hacer el execfile es la siguiente:

ismethod <function ismethod at 0xb7b7710c>
getmembers <function getmembers at 0xb7b77374>
Descriptor <class '__main__.Descriptor'>
atributo definido a
descriptor <__main__.Descriptor object at 0xb761d70c>
metodo_ejemplo es un metodo
soy metodo de ejemplo
{'x': 20, 'self': <__main__.Descriptor object at 0xb761d70c>}

  Me he podido dar cuenta que la variable local x que se define en el
metodo llamado "metodo_ejemplo" no es registrada en el diccionario
llamado "local" el cual le envio como parametro el comando
execfile...alguien me podría explicar el por qué de esta situación


   Bueno creo que este es mi último intento por tener "algo" de
control sobre las variables locales, agradezco vuestros aportes,
ayudas y paciencia

> >
> >
> > Saludos.
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > tny escribió:
> > > ¿Sería posible sustituir tanto el diccionario global como todos los locales,
> > > por otro objeto?.
> > >
> > > La idea es sustituirlos por diccionarios trucados con una funcionalidad
> > > añadida: guardar un registro de su actividad para posterior debug de
> > > scripts.
> > >
> > > Gracias.
>
> Abandoné el proyecto antes de empezar, así que no puedo decirte como reacciona con objetos "dict-like".
> Podrías mirar el código de psyco o de pypy, es posible que hagan algo que te sea de utilidad.
>
>
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>


-- 
Milton Inostroza Aguilera
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es