以下访问python的示例Enum
按切片的成员来自其 documentation (其中 Period
恰好是 Enum
):
list(Period)[:2]
子类化时 Enum
,我认为允许跳过 list
中的换行的语法可能是有意义的。 (即使使用我的子类的语法与访问 list
或 tuple
的成员的语法更加一致):import enum
class MyEnumMeta(enum.EnumMeta):
def __getitem__(self, indexOrSlice):
if isinstance(indexOrSlice, (int, slice)):
return list(self)[indexOrSlice]
else:
return enum.EnumMeta.__getitem__(self, indexOrSlice)
class MyEnum(enum.Enum, metaclass=MyEnumMeta): pass
class Period(MyEnum):
A = "a"
B = "b"
C = "c"
print(Period["A"])
print(Period[1]) # type: ignore[misc]
print(Period[:2]) # type: ignore[misc]
虽然这似乎执行得很好,mypy
除非我附加 # type: ignore[misc]
,否则会引发以下错误对于试图使用“更简洁”语法的每一行(这使得语法实际上不那么简洁):Enum index should be a string
(您可以在 mypy code 中搜索此内容,以查看相关部分)
我不喜欢添加一个语句来抑制发生在同一行中的任何合法的 [misc] 错误。此外,mypy 努力引发这个错误(而且
Enum
不允许直接使用压缩语法)这一事实让我想知道是否有充分的理由不能访问 Enum
。成员通过整数或切片,甚至以 Enum
中演示的方式文档。如果我不应该做我想做的事情,有人可以解释为什么吗?否则,有人可以建议更好的方法来处理 mypy 吗?如果 mypy 发生了未能预料到
Enum
的错误它遇到的实际上可能是 Enum
的子类覆盖 __getitem__
正如我所建议的,我该如何报告该错误?
最佳答案
您的更改没有任何问题。但是,Mypy 对枚举支持进行了硬编码,因此它无法识别它们。
关于python - 如何在子类 python 枚举上抑制 "index should be a string"类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68974940/