Python中暗示枚举成员值的类型

2024-10-08 18:31:23 发布

您现在位置:Python中文网/ 问答频道 /正文

对于枚举Foo,一种类型如何提示必须包含某个枚举的成员值(而不是成员本身)的变量?例如,一个值使得Foo(x)将返回Foo的有效成员

以下是我的激励示例的简化版本:

class DisbursementType(Enum):
    DISBURSEMENT = "disbursement"
    REFUND = "refund"
    ROLLBACK = "rollback"

class SerializedDisbursement(TypedDict):
    transaction_type: ???
    id: str
    amount: float

a: SerializedDisbursement = {"transaction_type": "refund", id: 1, amount: 4400.24}

我真的希望避免简单地将transaction_type键入Literal['disbursement', 'refund', 'rollback'],因为随着时间的推移,这很容易失去同步


Tags: 版本id示例类型footype成员amount
1条回答
网友
1楼 · 发布于 2024-10-08 18:31:23

最广泛兼容的选项是只使用一个断言来验证文本类型是否与枚举值不同步:

class DisbursementType(enum.Enum):
    DISBURSEMENT = "disbursement"
    REFUND = "refund"
    ROLLBACK = "rollback"

DisbursementValue = typing.Literal['disbursement', 'refund', 'rollback']

assert set(typing.get_args(DisbursementValue)) == {member.value for member in DisbursementType}

class SerializedDisbursement(typing.TypedDict):
    transaction_type: DisbursementValue
    id: str
    amount: float

这确保了与静态分析器的最大兼容性,但需要重复所有成员值。此外,不能静态检查断言


其他选项打破静态分析。例如,如果使用functional API从文字类型创建枚举:

DisbursementValue = typing.Literal['disbursement', 'refund', 'rollback']

DisbursementType = enum.Enum('DisbursementType',
                             {name.upper(): name for name in typing.get_args(DisbursementValue)})

然后mypydoesn't understand枚举,在这一点上,没有任何注释的意义

类似地,如果尝试对Literal类型使用非文字类型参数:

DisbursementValue = typing.Literal[tuple(member.value for member in DisbursementType)]

然后that breaks too

相关问题 更多 >

    热门问题