from enum import Enum, auto class TypeEnum(Enum): ANY = auto() STRING = auto() INT = auto() FLOAT = auto() NUMBER = auto() LIST = auto() LITERAL = auto() BOOL = auto() HANDLE = auto() TYPE = auto() USER = auto() def __str__(self): return f":{self.name.lower()}" HIERARCHY = { TypeEnum.ANY: None, TypeEnum.LITERAL: TypeEnum.ANY, TypeEnum.LIST: TypeEnum.ANY, TypeEnum.STRING: TypeEnum.LITERAL, TypeEnum.BOOL: TypeEnum.LITERAL, TypeEnum.NUMBER: TypeEnum.LITERAL, TypeEnum.INT: TypeEnum.NUMBER, TypeEnum.FLOAT: TypeEnum.NUMBER } def is_subtype_of(candidate, expected): if candidate == expected: return True parent = HIERARCHY[candidate] while parent is not None: if parent == expected: return True parent = HIERARCHY[parent] return False