如何在Python中键入字符串枚举

如何在Python中键入字符串枚举,python,types,enums,mypy,Python,Types,Enums,Mypy,我很好奇如何键入字符串枚举,例如: [“关键字1”、“关键字2”] 我想让变量v等于这些字符串中的任何一个。我可以通过文字的并集来实现这一点——并集[Literal[“keyword1”]、Literal[“keyword2”]],但如果这些关键字中的一个在将来发生更改,那么维护性就会变得困难。 理想情况下,我想定义如下: class Keywords(enum): keywordOne = "keyword1" keywordTwo = "keywor

我很好奇如何键入字符串枚举,例如: [“关键字1”、“关键字2”]

我想让变量v等于这些字符串中的任何一个。我可以通过文字的并集来实现这一点——并集[Literal[“keyword1”]、Literal[“keyword2”]],但如果这些关键字中的一个在将来发生更改,那么维护性就会变得困难。 理想情况下,我想定义如下:

class Keywords(enum):
   keywordOne = "keyword1"
   keywordTwo = "keyword2"
v: valueOf[Keywords] = Keywords.keywordOne.value # v = "keyword1"

但我不知道如何在MyPy中完成类似的事情,你就快到了。看起来您正在寻找的是一个自定义枚举对象,它本身是类型化的,然后是指定使用该枚举的类型注释。大概是这样的:

class Keywords(enum):
   keywordOne = "keyword1"
   keywordTwo = "keyword2"
v: valueOf[Keywords] = Keywords.keywordOne.value # v = "keyword1"
从枚举导入枚举
从键入import Literal
类自定义关键字(枚举):
关键词一:文字[“关键词1”]=“关键词1”
关键词二:文字[“关键词2”]=“关键词2”
v:CustomKeyword=CustomKeyword.keywordOne

这不会给您带来预期的结果吗?

不幸的是,这不会进行类型检查。例如,keywordOne:Literal[“keyword1”]=“keyword1”不起作用,因为我们给keywordOne分配的是枚举值而不是文本。(这是Python的一个问题)我一定对你说的话感到困惑,因为这个类型使用mypy检查我。如果我在初始赋值或以后的赋值中更改keywordOne的值,我将得到mypy错误:test.py:5:error:assignment中不兼容的类型(表达式的类型为“Literal['foo']”,变量的类型为“Literal['keyword1']”),test.py:10:error:assignment中不兼容的类型(表达式的类型为“Literal['bar']”,变量的类型为“Literal['keyword1']”)在一个文件(检查了一个源文件)中发现了2个错误,这太奇怪了。你的代码在我的机器上没有逐字检查,它必须是我这边的东西,所以我们在同一页上——你知道mypy是一个独立的类型检查程序,独立于代码执行运行吗?类型检查不是内置的,你需要运行它“mypy test.py”或类似的代码来获取上面的输出。是的,我们是!代码执行得很好,它在VSCode中由pyright专门标记,但mypy本身似乎并不在意。我将把这归因于我的本地配置在某个地方出错