Fabio Zadrozny wrote: > Anyone has any idea why the code attached does not work? > > Basically, after doing the deepcopy of the class that has __getattr__ > overridden, the python tracing facilities don't seem to work anymore. > > In the code-attached, if the deepcopy is removed, all works as > expected (or if __deepcopy__ is overridden too). > > Thanks, > > Fabio > > p.s. I've discovered this while trying to debug a real-world > application and the debugger stopped working after making that > deepcopy.
The problem seems to be a recursion error that implicitly switches off tracing: $ cat trace_test.py import sys def blowup(): blowup() def f(): print "f called" def trace(frame, event, arg): try: if frame.f_code.co_name == 'f': print "f seen", event finally: return trace sys.settrace(trace) if "-b" in sys.argv: try: blowup() except: pass f() $ python trace_test.py f seen call f seen line f called f seen return $ python trace_test.py -b f called deepcopy() probably triggers such a recursion by accessing the type_name attribute on a CppType instance with an empty __dict__. You can fix that with def __getattr__(self, attr): if attr == 'type_name': return super(CppType, self).__getattr__(attr) # ... I don't know why the exception is caught silently, nor how to make tracing survive the stack overflow. Peter -- http://mail.python.org/mailman/listinfo/python-list