pythonwith-statement

Python context manager that measures time


I am struggling to make a piece of code that allows to measure time spent within a "with" statement and assigns the time measured (a float) to the variable provided in the "with" statement.

import time

class catchtime:
    def __enter__(self):
        self.t = time.clock()
        return 1

    def __exit__(self, type, value, traceback):
        return time.clock() - self.t

with catchtime() as t:
    pass

This code leaves t=1 and not the difference between clock() calls. How to approach this problem? I need a way to assign a new value from within the exit method.

PEP 343 describes in more detail how contect manager works but I do not understand most of it.


Solution

  • Solved (almost). Resulting variable is coercible and convertible to a float (but not a float itself).

    class catchtime:
        def __enter__(self):
            self.t = time.clock()
            return self
    
        def __exit__(self, type, value, traceback):
            self.e = time.clock()
    
        def __float__(self):
            return float(self.e - self.t)
    
        def __coerce__(self, other):
            return (float(self), other)
    
        def __str__(self):
            return str(float(self))
    
        def __repr__(self):
            return str(float(self))
    
    with catchtime() as t:
        pass
    
    print t
    print repr(t)
    print float(t)
    print 0+t
    print 1*t
    
    1.10000000001e-05
    1.10000000001e-05
    1.10000000001e-05
    1.10000000001e-05
    1.10000000001e-05