Исходный код EJIO.utils.component.check.type_check
## /utils/check/type_check.py
from collections.abc import Callable
from typing import Any, ClassVar
from .type_checker_types import TypeCheckerTypes
from .type_checker import TypeCheckerClass
__all__ = [
'Types',
'TypeChecker',
]
[документация]
class Types(TypeCheckerTypes):
"""
Интегер-флаг, представляющий разные типы данных.
Каждый флаг — это битовая маска, позволяющая комбинировать несколько типов.
"""
__slots__ = ()
NONE = 0
NONE_TYPE = 1 << 0
INT = 1 << 1
FLOAT = 1 << 2
STRING = 1 << 3
LIST = 1 << 4
DICT = 1 << 5
BOOL = 1 << 6
NUMBER = 1 << 7 # int или float
PERCENT = 1 << 8 # int и 0 <= value <= 100
[документация]
class TypeChecker(TypeCheckerClass[Any, Types]):
"""
Класс для определения и проверки типов значений по флагам Types.
Позволяет получать комбинированное описание типов значения,
а также проверять соответствие значения любому или всем указанным типам.
"""
__slots__ = ()
_type_checks: ClassVar[dict[Types, Callable[[Any], bool]]]= {
Types.NONE_TYPE: lambda v: v is None,
Types.INT: lambda v: isinstance(v, int) and not isinstance(v, bool),
Types.FLOAT: lambda v: isinstance(v, float),
Types.STRING: lambda v: isinstance(v, str),
Types.LIST: lambda v: isinstance(v, list),
Types.DICT: lambda v: isinstance(v, dict),
Types.BOOL: lambda v: isinstance(v, bool),
Types.NUMBER: lambda v: isinstance(v, (int, float)) and not isinstance(v, bool),
Types.PERCENT: (
lambda v: isinstance(v, int) and not isinstance(v, bool) and 0 <= v <= 100
),
}