| import math | |
| import operator | |
| def _nonneg_int_or_fail(n, var_name, strict=True): | |
| try: | |
| if strict: | |
| # Raises an exception if float | |
| n = operator.index(n) | |
| elif n == math.floor(n): | |
| n = int(n) | |
| else: | |
| raise ValueError() | |
| if n < 0: | |
| raise ValueError() | |
| except (ValueError, TypeError) as err: | |
| raise err.__class__(f"{var_name} must be a non-negative integer") from err | |
| return n | |