Python 使用枚举的类型化枚举实现;要么不';不工作或不工作';t型检验

Python 使用枚举的类型化枚举实现;要么不';不工作或不工作';t型检验,python,enums,mypy,Python,Enums,Mypy,为了更好地理解Python的Enum实现,并熟悉元编程,我想看看是否可以根据其值的类型参数化Enum变量,这可能会很有趣。类似于IntEnum,只是更像Enum[int],Enum[str],等等 事实证明,这比我想象的要困难得多。给定Enum的实现方式,类无法从Generic[T]以及Enum派生。因此,我尝试将Enum作为后台实例变量: 从枚举导入枚举 从键入导入泛型、TypeVar、Type、Union T=类型变量(“T”) TEnumMeta类(类型): 定义(cls、名称、基础、属性

为了更好地理解Python的
Enum
实现,并熟悉元编程,我想看看是否可以根据其值的类型参数化Enum变量,这可能会很有趣。类似于
IntEnum
,只是更像
Enum[int]
Enum[str]
,等等

事实证明,这比我想象的要困难得多。给定
Enum
的实现方式,类无法从
Generic[T]
以及
Enum
派生。因此,我尝试将
Enum
作为后台实例变量:

从枚举导入枚举
从键入导入泛型、TypeVar、Type、Union
T=类型变量(“T”)
TEnumMeta类(类型):
定义(cls、名称、基础、属性):
instance=super()。\uuuuu new\uuuuuu(cls、名称、基数、属性)
实例。_enum=enum(名称、属性)
对于键,attr_dict.items()中的attr:
setattr(实例,键,getattr(实例。\u枚举,键))
返回实例
类TEnum(泛型[T],元类=TEnumMeta):
...
不幸的是,向上述代码中添加类型将导致类型检查失败,出现“Enum type as attribute不受支持”错误。好吧,不一定是世界末日,但如果有办法的话,我很乐意了解它

然后我想添加一个处理标签或值的
get()
方法。不幸的是,以下内容未通过其类型检查:

TEnum类(泛型[T],元类=TEnumMeta):
@类方法
def get(cls:“Type[TEnum[T]]”,val:Union[T,str,Enum])->Enum:
对于键,在cls.\u enum.\u members.\u.items()中的值:
如果[key,value,value.value]中的val为:
返回值
raise VALUERROR(f“无法从{cls}获取{val}”)
结果是:

metaclass\u test.py:21:错误:“Type[TEnum[T]]”没有属性“\u enum”

嗯。好啊我假设
\u enum
是在实例上设置的,而不是在类上设置的。以下解决方法类型检查:

TEnum类(泛型[T],元类=TEnumMeta):
@类方法
def get(cls:“Type[TEnum[T]]”,val:Union[T,str,Enum])->Enum:
对于目录中的nm(cls):
值=getattr(cls,nm)
如果不是isinstance(值,枚举):
持续
如果val单位为[nm,value,value.value]:
返回值
raise VALUERROR(f“无法从{cls}获取{val}”)
但不起作用:

ValueError:无法从

但如果失败了,那么这究竟是为什么

TEnum类(泛型[T],元类=TEnumMeta):
...
def-get(cls:Type[TEnum[T]],val:Union[T,str,Enum])->Enum:
对于目录中的nm(cls):
值=getattr(cls,nm)
如果不是isinstance(值,枚举):
持续
如果val单位为[nm,value,value.value]:
返回值
raise VALUERROR(f“无法从{cls}获取{val}”)
setattr(十,get),classmethod(get))
类别Foo(十[int]):
foo=1
巴=2
这种类型检查,并且
Foo.get(“Foo”)
工作。不幸的是,
Foo.get(“Foo”)
本身没有类型检查:

metaclass\u test.py:46:错误:“Type[Foo]”没有属性“get”

我对它为什么有效和为什么不进行类型检查感到困惑

最后:即使上述代码有效,以下代码仍将进行类型检查:

类条(TEnum[str]):
baz=1
quux=2
有没有办法使类型检查失败