如何键入常量联合
How to type a union of constants
我想做以下事情:
from typing import Union, Literal
YES = 1
NO = 0
ValidResponse = Union[Literal[YES], Literal[NO]]
当然,Python不会让我这样做,因为YES
和NO
被认为是变量,而不是文字数字。
显然我可以做到 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
做这种事情。您必须将变量显式注释为“文字”类型。我介绍的 YesType
和 NoType
别名并不是绝对必要的,但可能有助于清楚:
from typing import Union, Literal
YesType = Literal[1]
NoType = Literal[0]
YES: YesType = 1
NO: NoType = 0
ValidResponse = Union[YesType, NoType]
我想做以下事情:
from typing import Union, Literal
YES = 1
NO = 0
ValidResponse = Union[Literal[YES], Literal[NO]]
当然,Python不会让我这样做,因为YES
和NO
被认为是变量,而不是文字数字。
显然我可以做到 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
做这种事情。您必须将变量显式注释为“文字”类型。我介绍的 YesType
和 NoType
别名并不是绝对必要的,但可能有助于清楚:
from typing import Union, Literal
YesType = Literal[1]
NoType = Literal[0]
YES: YesType = 1
NO: NoType = 0
ValidResponse = Union[YesType, NoType]