File: LP6E/Chapter32/tracer1.py

class tracer:
    def __init__(self, func):          # Remember original, init counter
        self.calls = 0
        self.func  = func
    def __call__(self, *args):         # On later calls: add logic, run original
        self.calls += 1
        print(f'call {self.calls} to {self.func.__name__}')
        return self.func(*args)

@tracer                                # Same as hack = tracer(hack)
def hack(a, b, c):                     # Wrap hack in a decorator object
    return a + b + c

if __name__ == '__main__':
    print(hack(1, 2, 3))               # Really calls the tracer wrapper object
    print(hack('a', 'b', 'c'))         # Invokes __call__ in class



[Home page] Books Code Blog Python Author Train Find ©M.Lutz