def _is_int(value: object) -> bool:
return isinstance(value, int) andnot isinstance(value, bool)
def meter_advance(opening_read: int, closing_read: int, digits: int) -> int:
"""Units a meter advanced between two reads. A closing read lower than the opening read means the register rolled over past all nines, once. """ifnot _is_int(digits) or digits < 1or digits > 15:
raise ValueError("digits must be a whole number from 1 to 15, received %s" % (digits,))
span = 10**digits
for read in (opening_read, closing_read):
ifnot _is_int(read) or read < 0or read >= span:
raise ValueError(
"reads must be whole numbers from 0 to %d for a %d-digit meter, received %s" % (span - 1, digits, read)
)
if closing_read >= opening_read:
return closing_read - opening_read
return closing_read + span - opening_read