【问题标题】:How to type-hint an Enum of strings in Python [duplicate]如何在Python中键入提示字符串的枚举[重复]
【发布时间】:2020-12-07 10:39:15
【问题描述】:

我很好奇如何键入提示字符串枚举,例如: ["keyword1", "keyword2"]

我希望某个变量 v 等于这些字符串文字中的任何一个。我可以通过文字联合来实现这一点 - Union[Literal["keyword1"], Literal["keyword2"]] 但如果这些关键字中的一个在未来发生变化,这将使得可维护性变得困难。 理想情况下,我想这样定义:

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

但我不确定如何在 MyPy 中完成这样的事情

【问题讨论】:

    标签: python types enums mypy


    【解决方案1】:

    你快到了。您正在寻找的似乎是一个自定义枚举对象,它本身是类型化的,然后键入指示该枚举使用的注释。像这样的:

    from enum import Enum
    from typing import Literal
    
    class CustomKeyword(Enum):
       keywordOne: Literal["keyword1"] = "keyword1"
       keywordTwo: Literal["keyword2"] = "keyword2"
    
    v: CustomKeyword = CustomKeyword.keywordOne
    

    这不会给你预期的结果吗?

    【讨论】:

    • 不幸的是,这不会进行类型检查。 keywordOne:例如,Literal["keyword1"] = "keyword1" 不起作用,因为我们为 keywordOne 分配了枚举值而不是文字。 (这是 Python 的一个问题)
    • 我一定对你在说什么感到困惑,因为这种类型使用 mypy 来检查我。如果我在初始分配或以后更改关键字的值,我将得到 mypy 错误:test.py:5:错误:分配中的类型不兼容(表达式的类型为“Literal['foo']”,变量的类型为“Literal[' keyword1']") test.py:10: error: Incompatible types in assignment (expression has type "Literal['bar']", variable has type "Literal['keyword1']") 在 1 个文件中发现 2 个错误(已检查1个源文件)
    • 这太奇怪了。你的代码没有在我的机器上进行类型检查,那么它一定是我的结果
    • 我们在同一页上——你知道 mypy 是一个独立的类型检查器,它独立于代码执行运行吗?类型检查不是内置的,你需要运行“mypy test.py”或类似的东西来获得上面的输出。
    • 是的,我们是!该代码执行良好,它在 VSCode 中由 pyright 专门标记,但 mypy 本身似乎并不关心。我将把这归结为我的本地配置在某处出错
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多