Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中暗示枚举成员值的类型_Python_Python 3.x_Enums - Fatal编程技术网

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,但只“静态”使用它-第二个参数必须是文本。它不能计算任意的运行时表达式来计算名称和值。