Python中暗示枚举成员值的类型
对于枚举Python中暗示枚举成员值的类型,python,python-3.x,enums,Python,Python 3.x,Enums,对于枚举Foo,一种类型如何提示必须包含某个枚举的成员值(而不是成员本身)的变量?例如,一个值使得Foo(x)将返回Foo的有效成员 以下是我的激励示例的简化版本: class DisbursementType(Enum): DISBURSEMENT = "disbursement" REFUND = "refund" ROLLBACK = "rollback" class SerializedDisburse
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\u type
键入Literal['payment'、'return'、'rollback']
因为随着时间的推移,这很容易失去同步。最广泛的兼容选项是使用一个断言来验证文本类型是否与枚举值不同步:
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
这确保了与静态分析器的最大兼容性,但需要重复所有成员值。此外,不能静态检查断言
其他选项打破静态分析。例如,如果使用从文字类型创建枚举:
DisbursementValue = typing.Literal['disbursement', 'refund', 'rollback']
DisbursementType = enum.Enum('DisbursementType',
{name.upper(): name for name in typing.get_args(DisbursementValue)})
然后mypy调用枚举,在这一点上,没有任何注释的意义
类似地,如果尝试对literal
类型使用非literal类型参数:
DisbursementValue = typing.Literal[tuple(member.value for member in DisbursementType)]
然后。最广泛兼容的选项是使用一个断言来验证文本类型是否与枚举值不同步:
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
这确保了与静态分析器的最大兼容性,但需要重复所有成员值。此外,不能静态检查断言
其他选项打破静态分析。例如,如果使用从文字类型创建枚举:
DisbursementValue = typing.Literal['disbursement', 'refund', 'rollback']
DisbursementType = enum.Enum('DisbursementType',
{name.upper(): name for name in typing.get_args(DisbursementValue)})
然后mypy调用枚举,在这一点上,没有任何注释的意义
类似地,如果尝试对literal
类型使用非literal类型参数:
DisbursementValue = typing.Literal[tuple(member.value for member in DisbursementType)]
然后。我认为在Python的类型提示系统中,无论如何都没有表达您想要的内容的方法。也许
Literal
将是您最好的选择……我认为在Python的类型暗示系统中没有任何东西可以表达您想要的内容。可能Literal
将是您的最佳选择…这很有效!我可以处理两次手动键入值这一次要的不符合人体工程学的因素,但不能处理bug促进因素。有了一个简单的助手来做断言,我就明白了。Mypy不理解枚举函数API是一个主要问题,它基本上强迫您尽可能使用类语法声明枚举。@bad_coder:它理解函数API,但只“静态”使用它-第二个参数必须是文本。它不能计算任意的运行时表达式来计算名称和值。这很有效!我可以处理两次手动键入值这一次要的不符合人体工程学的因素,但不能处理bug促进因素。有了一个简单的助手来做断言,我就明白了。Mypy不理解枚举函数API是一个主要问题,它基本上强迫您尽可能使用类语法声明枚举。@bad_coder:它理解函数API,但只“静态”使用它-第二个参数必须是文本。它不能计算任意的运行时表达式来计算名称和值。