diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-05-07 19:14:14 +0000 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-05-07 19:14:14 +0000 |
commit | 34c044ff5b7af76c4b65c63e1923183a9957de2e (patch) | |
tree | 32152a05a05d145432cffb7147bceeb6551bdcc7 /Demo/metaclasses/Trace.py | |
parent | 993527485ebb3f8a7e8759ab480547a0b61b82eb (diff) | |
download | cpython-git-34c044ff5b7af76c4b65c63e1923183a9957de2e.tar.gz |
remove old metaclass demos
Diffstat (limited to 'Demo/metaclasses/Trace.py')
-rw-r--r-- | Demo/metaclasses/Trace.py | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/Demo/metaclasses/Trace.py b/Demo/metaclasses/Trace.py deleted file mode 100644 index d211d172c2..0000000000 --- a/Demo/metaclasses/Trace.py +++ /dev/null @@ -1,144 +0,0 @@ -"""Tracing metaclass. - -XXX This is very much a work in progress. - -""" - -import types, sys - -class TraceMetaClass: - """Metaclass for tracing. - - Classes defined using this metaclass have an automatic tracing - feature -- by setting the __trace_output__ instance (or class) - variable to a file object, trace messages about all calls are - written to the file. The trace formatting can be changed by - defining a suitable __trace_call__ method. - - """ - - __inited = 0 - - def __init__(self, name, bases, dict): - self.__name__ = name - self.__bases__ = bases - self.__dict = dict - # XXX Can't define __dict__, alas - self.__inited = 1 - - def __getattr__(self, name): - try: - return self.__dict[name] - except KeyError: - for base in self.__bases__: - try: - return base.__getattr__(name) - except AttributeError: - pass - raise AttributeError(name) - - def __setattr__(self, name, value): - if not self.__inited: - self.__dict__[name] = value - else: - self.__dict[name] = value - - def __call__(self, *args, **kw): - inst = TracingInstance() - inst.__meta_init__(self) - try: - init = inst.__getattr__('__init__') - except AttributeError: - init = lambda: None - init(*args, **kw) - return inst - - __trace_output__ = None - -class TracingInstance: - """Helper class to represent an instance of a tracing class.""" - - def __trace_call__(self, fp, fmt, *args): - fp.write((fmt+'\n') % args) - - def __meta_init__(self, klass): - self.__class = klass - - def __getattr__(self, name): - # Invoked for any attr not in the instance's __dict__ - try: - raw = self.__class.__getattr__(name) - except AttributeError: - raise AttributeError(name) - if type(raw) != types.FunctionType: - return raw - # It's a function - fullname = self.__class.__name__ + "." + name - if not self.__trace_output__ or name == '__trace_call__': - return NotTracingWrapper(fullname, raw, self) - else: - return TracingWrapper(fullname, raw, self) - -class NotTracingWrapper: - def __init__(self, name, func, inst): - self.__name__ = name - self.func = func - self.inst = inst - def __call__(self, *args, **kw): - return self.func(self.inst, *args, **kw) - -class TracingWrapper(NotTracingWrapper): - def __call__(self, *args, **kw): - self.inst.__trace_call__(self.inst.__trace_output__, - "calling %s, inst=%s, args=%s, kw=%s", - self.__name__, self.inst, args, kw) - try: - rv = self.func(self.inst, *args, **kw) - except: - t, v, tb = sys.exc_info() - self.inst.__trace_call__(self.inst.__trace_output__, - "returning from %s with exception %s: %s", - self.__name__, t, v) - raise t(v).with_traceback(tb) - else: - self.inst.__trace_call__(self.inst.__trace_output__, - "returning from %s with value %s", - self.__name__, rv) - return rv - -Traced = TraceMetaClass('Traced', (), {'__trace_output__': None}) - - -def _test(): - global C, D - class C(Traced): - def __init__(self, x=0): self.x = x - def m1(self, x): self.x = x - def m2(self, y): return self.x + y - __trace_output__ = sys.stdout - class D(C): - def m2(self, y): print("D.m2(%r)" % (y,)); return C.m2(self, y) - __trace_output__ = None - x = C(4321) - print(x) - print(x.x) - print(x.m1(100)) - print(x.m1(10)) - print(x.m2(33)) - print(x.m1(5)) - print(x.m2(4000)) - print(x.x) - - print(C.__init__) - print(C.m2) - print(D.__init__) - print(D.m2) - - y = D() - print(y) - print(y.m1(10)) - print(y.m2(100)) - print(y.x) - -if __name__ == '__main__': - _test() |