#!/usr/bin/env python3
+# © Copyright 2021-2022, Scott Gasch
+
+"""A helper class for generating thread safe monotonically increasing
+id numbers.
+
+"""
+
import itertools
import logging
+# This module is commonly used by others in here and should avoid
+# taking any unnecessary dependencies back on them.
+
logger = logging.getLogger(__name__)
generators = {}
-def get(name: str) -> int:
+def get(name: str, *, start=0) -> int:
"""
- def __init__(self):
- self.my_unique_id = id_generator.get("student_id")
+ Returns a thread-safe, monotonically increasing id suitable for use
+ as a globally unique identifier.
+
+ >>> import id_generator
+ >>> id_generator.get('student_id')
+ 0
+ >>> id_generator.get('student_id')
+ 1
+ >>> id_generator.get('employee_id', start=10000)
+ 10000
+ >>> id_generator.get('employee_id', start=10000)
+ 10001
"""
if name not in generators:
- generators[name] = itertools.count()
+ generators[name] = itertools.count(start, 1)
x = next(generators[name])
- logger.debug(f"Generated next id {x}")
+ logger.debug("Generated next id %d", x)
return x
+
+
+if __name__ == '__main__':
+ import doctest
+
+ doctest.testmod()