Easier and more self documenting patterns for loading/saving Persistent
[python_utils.git] / stopwatch.py
index cdd405b558213a9fb7c0ca38eec72ad41ba47a14..4e69b6992b278df8eb8e725954d9c610468318aa 100644 (file)
@@ -1,16 +1,21 @@
 #!/usr/bin/env python3
 
+# © Copyright 2021-2022, Scott Gasch
+
+"""A simple stopwatch decorator / context for timing things."""
+
+import contextlib
 import time
-from typing import Callable
+from typing import Callable, Literal
 
 
-class Timer(object):
+class Timer(contextlib.AbstractContextManager):
     """
     A stopwatch to time how long something takes (walltime).
 
     e.g.
 
-        with timer.Timer() as t:
+        with stopwatch.Timer() as t:
             do_the_thing()
 
         walltime = t()
@@ -18,8 +23,8 @@ class Timer(object):
     """
 
     def __init__(self) -> None:
-        self.start = None
-        self.end = None
+        self.start = 0.0
+        self.end = 0.0
 
     def __enter__(self) -> Callable[[], float]:
         """Returns a functor that, when called, returns the walltime of the
@@ -29,6 +34,6 @@ class Timer(object):
         self.end = 0.0
         return lambda: self.end - self.start
 
-    def __exit__(self, *args) -> bool:
+    def __exit__(self, *args) -> Literal[False]:
         self.end = time.perf_counter()
-        return None  # don't suppress exceptions
+        return False