__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