python - 如何在子类 python 枚举上抑制 "index should be a string"类型错误

标签 python enums mypy

以下访问python的示例Enum按切片的成员来自其 documentation (其中 Period 恰好是 Enum ):

list(Period)[:2]
子类化时 Enum ,我认为允许跳过 list 中的换行的语法可能是有意义的。 (即使使用我的子类的语法与访问 listtuple 的成员的语法更加一致):
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/

相关文章:

.net - 将 Nullable Enum 设置为 $null - 这真的会导致 PSInvalidCastException 吗?

wpf - ComboBox 绑定(bind)到枚举,我做错了什么?

flask - 如何使用flask_sqlalchemy正确注释类型?

python - 启用 mypy `strict_Optional 有什么优点?

python - 将 Typing 和 Mypy 与描述符一起使用

python - SQLAlchemy 排序依据先于分组依据

javascript - 使用 Jinja 将数据作为 JSON 对象从 Python 发送到 Javascript

python - 在 Heroku 上部署时出现 Django 1.7 迁移错误

python - 手动删除 anaconda python 中 pkgs 文件夹中的所有文件是否安全?

mysql - 根据列枚举值创建 SQL 语句