1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
"""
Miscellaneous utilities that :py:mod:`line_profiler` uses.
"""
import enum
class _StrEnumBase(str, enum.Enum):
"""
Base class mimicking :py:class:`enum.StrEnum` in Python 3.11+.
Example
-------
>>> import enum
>>>
>>>
>>> class MyEnum(_StrEnumBase):
... foo = enum.auto()
... BAR = enum.auto()
...
>>>
>>> MyEnum.foo
<MyEnum.foo: 'foo'>
>>> MyEnum('bar')
<MyEnum.BAR: 'bar'>
>>> MyEnum('baz')
Traceback (most recent call last):
...
ValueError: 'baz' is not a valid MyEnum
"""
@staticmethod
def _generate_next_value_(name, *_, **__):
return name.lower()
def __eq__(self, other):
return self.value == other
def __str__(self):
return self.value
class StringEnum(getattr(enum, 'StrEnum', _StrEnumBase)):
"""
Convenience wrapper around :py:class:`enum.StrEnum`.
Example
-------
>>> import enum
>>>
>>>
>>> class MyEnum(StringEnum):
... foo = enum.auto()
... BAR = enum.auto()
...
>>>
>>> MyEnum.foo
<MyEnum.foo: 'foo'>
>>> MyEnum('bar')
<MyEnum.BAR: 'bar'>
>>> bar = MyEnum('BAR') # Case-insensitive
>>> bar
<MyEnum.BAR: 'bar'>
>>> assert isinstance(bar, str)
>>> assert bar == 'bar'
>>> str(bar)
'bar'
"""
@classmethod
def _missing_(cls, value):
if not isinstance(value, str):
return None
members = {name.casefold(): instance
for name, instance in cls.__members__.items()}
return members.get(value.casefold())
|