| |
| |
|
|
| |
| |
|
|
| import functools |
| import logging |
| from enum import Enum |
|
|
|
|
| @functools.lru_cache(None) |
| def warning_once(self, *args, **kwargs): |
| """ |
| This method is identical to `logger.warning()`, but will emit the warning with the same message only once |
| |
| Note: The cache is for the function arguments, so 2 different callers using the same arguments will hit the cache. |
| The assumption here is that all warning messages are unique across the code. If they aren't then need to switch to |
| another type of cache that includes the caller frame information in the hashing function. |
| """ |
| self.warning(*args, **kwargs) |
|
|
|
|
| logging.Logger.warning_once = warning_once |
| logging.Logger.warn_once = warning_once |
|
|
|
|
| class StrEnum(str, Enum): |
| """ |
| This is equivalent to Python's :class:`enum.StrEnum` since version 3.11. |
| We include this here for compatibility with older version of Python. |
| """ |
|
|
| def __str__(self) -> str: |
| return self.value |
|
|
| def __repr__(self) -> str: |
| return f"'{str(self)}'" |
|
|