from enum import Enum as _Enum
from typing import TypeVar, Type, Generic, Callable
class BaseModel(_BaseModel):
pass
T = TypeVar('T')
GT = TypeVar('GT')
# 扩展 enum
class EnumBase(Generic[GT], _Enum):
# 额外对象
extra_obj: GT
def __new__(
cls: Type[T], value: str, extra_obj: GT = None,
) -> T:
obj = object.__new__(cls)
obj._value_ = value
obj.extra_obj = extra_obj
return obj
class B:
def __init__(self, value):
self.value = value
# 这里应该如何注释泛型? 这样写 pycharm 是会提示类型的, 但是会报错
class EnumTest(EnumBase[B]):
A = 'A', B(1)
B = 'B', B(2)
foo = EnumTest.A.extra_obj
print(foo.value)
报错内容是
File "xxx", line 35, in <module>
class EnumTest(EnumBase[B]):
File "xxx\enum.py", line 408, in __getitem__
return cls._member_map_[name]
KeyError: <class '__main__.B'>
也就是说 EnumBase[B]会直接触发 EnumMeta 的__getitem__, 不知道有没有什么好的解决办法
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.