
Hello. It should be also possible to specify the values of enum constants explicitly. For 'bitmask' type only powers of 2 should be allowed or maybe the values could be the exponents (as your TypeFlag example indicates). The same way 'symbolic' type acts as str and 'sequential' type acts as int, 'bitmask' type could act both as int and set (or frozenset) since its semantics is like of set. The enum value object could represent both the int value and corresponding singleton set. OR-ing would produce corresponding multivalue set.
isinstance(TypeFlag.HEAPTYPE, int) True isinstance(TypeFlag.HEAPTYTE, set) True
TypeFlag.HAS_GC | TypeFlag.INT_SUBCLASS TypeFlag.HEAPTYPE|HAS_GS # or maybe <TypeFlag {HEAPTYPE, HAS_GS}> TypeFlag.HEAPTYPE in (TypeFlag.HEAPTYPE | TypeFlag.HAS_GC) True TypeFlag.HEAPTYPE in TypeFlag.HEAPTYPE True
TypeFlag(1) TypeFlag.HEAPTYPE TypeFlag(2) TypeFlag.HAS_GC set(TypeFlag.HEAPTYPE) {1} set(TypeFlag.HEAPTYPE | TypeFlag.HAS_GC) {1, 2} int(TypeFlag.HEAPTYPE) 2 int(TypeFlag.HEAPTYPE | TypeFlag.HAS_GC) 6
Note the difference between n and 2 ** n semantics. So there slould be something like
TypeFlag.decompose(2) TypeFlag.HEAPTYPE TypeFlag.decompose(6) TypeFlag.HEAPTYPE|HAS_GS
Regards, Drekin