__setattr__ para locals()

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Mie Nov 28 04:43:18 CET 2007


El 27/11/07, Chema Cortes <pych3m4 en gmail.com> escribió:
> El 27/11/07, Milton Galo Patricio Inostroza Aguilera
> <minoztro en gmail.com> escribió:
> > Entiendo que locals() retorna un objeto de tipo dict...pero como hago
> > para que cada vez que defino una variable local pueda manejar la
> > escritura en el diccionario en el cual python guarda esas variables
> > locales?....no veo como puedo accesar a ese diccionario....
>
> No tengo claro qué pretendes, pero el acceso a los objetos
> globales/locales está limitado por razones de sincronismo de
> multihilos (GIL). Por esa razón su acceso se hace a través de una
> función y no directamente por referencia.

Mi problema es que tengo que tener el control de acceso a los objetos
locales, igual como lo hago con __setattr__ y con __getattribute__
para los atributos y métodos de una clase.

>
> Lo que te propongo es usar el comando exec (ó la función eval()) para
> ejecutar el código con un diccionario/mapping que puedas controlar a
> tu gusto, todo como una capa de abstracción por encima del código que
> quieres estudiar.
>
>
> >estuve
> > mirando el comando exec [1], vi algunos ejemplos y exec ejecuta
> > comandos que están como string's....igual no entendí mucho lo
> > siguiente:   The built-in functions globals() and locals() return the
> > current global and local dictionary, respectively, which may be useful
> > to pass around for use by exec.
> >
> >
> >    Quizás con un pequeño ejemplo me puedas ayudar, gracias por tu tiempo, salu2!
>
> class MyGlobals(dict):
>   def __setitem__(self, id, value):
>     print "Variable ",id,"=",value
>     dict.__setitem__(self,id,value)
>
> exec "x=0" in MyGlobals()

:-) funciona, pero lamentablemente tengo que controlar código que no
estará escrito por mi, si no que por algún programador "x"  y lo más
seguro que el quiera escribir x = 0.

Te muestro un código de ejemplo:


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()


if __name__ == "__main__":
    b = Descriptor()
    b.metodo_ejemplo()

   Si te fijas en metodo_ejemplo tengo una variable local llamada "x"
y me gustaría que al asignarla o modificar su valor pasara lo mismo
que cuando lo hago con el atributo a {self.a}.

   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.

> _______________________________________________
> 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