Source code for asynciojobs.watch

"""
A utility to print time and compute durations, mostly for debugging and tests.
"""

from datetime import datetime

[docs] class Watch: """ This class essentially remembers a starting point, so that durations relative to that epoch can be printed for debug instead of a plain timestamp. Parameters: message(str): used in the printed message at creation time, show_elapsed(bool): tells if a message with the elapsed time needs to be printed at creation time (elapsed will be 0), show_wall_clock(bool): same for the wall clock. Examples: Here's a simple use case; note that ``print_wall_clock()`` is a static because it is mostly useful, precisely, when you do not have a ``Watch`` object at hand:: $ python3 Python 3.6.4 (default, Mar 9 2018, 23:15:12) <snip> >>> from asynciojobs import Watch >>> import time >>> watch = Watch("hello there"); time.sleep(1); watch.print_elapsed() 000.000 hello there 001.000 >>> >>> >>> Watch.print_wall_clock() 20:48:27.782 >>> """ # default is to print the elapsed format only def __init__(self, message=None, *, show_elapsed=True, show_wall_clock=False): self.start = 0 self.reset() message = message if message is not None else "" if show_elapsed: self.print_elapsed(" {}\n".format(message)) if show_wall_clock: self.print_wall_clock(" {}\n".format(message))
[docs] def reset(self): """ Use current wall clock as starting point. """ self.start = datetime.now()
[docs] def seconds(self): """ Returns: float: time elapsed since start, in seconds. """ return (datetime.now() - self.start).total_seconds()
[docs] def elapsed(self): """ Returns: str: number of seconds elapsed since start, formatted on 7 characters: 3 for seconds, a dot, 3 for milliseconds """ return "{:07.3f}".format(self.seconds())
[docs] def print_elapsed(self, suffix=" "): """ Print the elapsed time since start in format SSS.MMM + a suffix. Parameters: suffix(str): is appended to the output; to be explicit, by default no newline is added. """ print("{} {}".format(self.elapsed(), suffix), end="")
[docs] @staticmethod def print_wall_clock(suffix=" "): """ Print current time in HH:MM:SS.MMM + a suffix. Parameters: suffix(str): is appended to the output; to be explicit, by default no newline is added. """ now = datetime.now() millisecond = now.microsecond // 1000 timestamp = datetime.now().strftime("%H:%M:%S") print("{}.{:03d}{}".format(timestamp, millisecond, suffix), end="")