import inspect, os, sys DEBUG = int(os.environ.get('DEBUG_MYPRODUCT', 0)) ## ## Debugging ## def ObserverProxy(method_names): class Proxy: def __init__(self): self._observers = [] def add_observer(self, observer): self._observers.append(observer) def remove_observer(self, observer): self._observers.remove(observer) def create_method_proxy(method_name): def method_proxy(self, *args, **kwargs): for observer in self._observers: getattr(observer, method_name)(*args, **kwargs) return method_proxy for method_name in method_names: setattr(Proxy, method_name, create_method_proxy(method_name)) return Proxy() debugobserver = ObserverProxy(["write", "close"]) debugobserver.add_observer(sys.stdout) #debugobserver.add_observer(open('myproduct-debug.log','a')) def debug(s, tabs=0, steps=(1,), f=False): if DEBUG or f: inspect_dbg = [] if type(steps)==type(1): steps = range(1, steps+1) for i in steps: try: #caller_module = inspect.stack()[i][1] caller_method = inspect.stack()[i][3] caller_method_line = inspect.stack()[i][2] except IndexError: break inspect_dbg.append("%s:%s"%(caller_method, caller_method_line)) out = "\t"*tabs + "%s (%s)"%(s, ", ".join(inspect_dbg)) print >>debugobserver, out