__setattr__ para locals()

Chema Cortes pych3m4 en gmail.com
Jue Nov 29 04:18:52 CET 2007


El 28/11/07, Milton Galo Patricio Inostroza Aguilera
<minoztro en gmail.com> escribió:

> Gracias Chema por tus indicaciones...los muchachos de la universidad
> de chile igual tuvieron que utilizar el bytecode de java para lograr
> su objetivo...yo quería lograr que a través de programación se pudiera
> hacer la instrumentación de código pero como me han dicho y me he
> podido dar cuenta esto no se puede hacer para las variables
> locales...así que ahora a estudiar el bytecode de python

Necesitaría conocer algo más de lo que buscas hacer antes de perder
tiempo en hacerte algún ejemplo con bytecodes. De momento, mira este
código para empezar:

import sys
import dis

class MyDict(dict):
    def __setitem__(self,k,v):
        print k,"=",v
        dict.__setitem__(self,k,v)
    def update(self,d):
        for k,v in d.items():
            if not self.has_key(k) or self[k]<>d[k]:
                self[k]=v

class MyTrace:

    def __init__(self,locals={}):
        self.locals=MyDict(locals)

    def mytrace(self,frame,evt,arg):
        locals=frame.f_locals
        lineno=frame.f_lineno
        code=frame.f_code
        if evt=="call":
            print "Entrando en '%s'"%code.co_name
            print "Variables locales",code.co_varnames
            dis.disassemble(code,frame.f_lasti)
            return MyTrace(locals).mytrace
        elif evt=="line":
            print "linea",lineno,": ",
            self.locals.update(locals)
            print
            return self.mytrace
        elif evt=="return":
            print "Retorna",arg

mytrace=MyTrace()
sys.settrace(mytrace.mytrace)

def clausura(i):
    x=i
    y=x*2
    z=[y]*10
    return 1

clausura(100)
_______________________________________________
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