如何键入常量联合

How to type a union of constants

我想做以下事情:

from typing import Union, Literal
YES = 1
NO = 0
ValidResponse = Union[Literal[YES], Literal[NO]]

当然,Python不会让我这样做,因为YESNO被认为是变量,而不是文字数字。

显然我可以做到 ValidResponse = Union[Literal[1], Literal[0]],但是作为一个程序员稍后编辑这个文件,为了改变 YES 使用的常量(例如 YES = 'yes'),这似乎很奇怪,我需要在两个不同的地方更改它。

处理这种情况的最佳方法是什么?

您几乎可以肯定只是使用 enum 代替:

import enum

class ValidResponse(enum.Enum):
    YES = 1
    NO = 0

现在您可以使用 ValidResponse 作为注释:

def foo(response: ValidResponse) -> whatever:
    # do something with response
在这些情况下,

通常是更简洁的解决方案,但请注意 可能 typing.Literal 做这种事情。您必须将变量显式注释为“文字”类型。我介绍的 YesTypeNoType 别名并不是绝对必要的,但可能有助于清楚:

from typing import Union, Literal

YesType = Literal[1]
NoType = Literal[0]

YES: YesType = 1
NO: NoType = 0

ValidResponse = Union[YesType, NoType]