在工具提示中,
Literal
指的是typing.Literal
,它是一种特殊形式,用于定义一个类型,该类型是所有给定文字值的集合。
很容易看出
Literal[1]
是int
的子类型,Literal['foo']
是str
的子类型等等。
在这种情况下,类型检查器 (Pyright) 能够推断出
x
的更具体类型,因此它会继续执行此操作。这是一个功能,而不是一个错误。根据流程,此类型可能会发生变化:
(游乐场链接)
x = 1235
reveal_type(x) # Literal[1235]
for _ in range(0):
x += 2
reveal_type(x) # int
reveal_type(x) # int
还应该注意的是,其他类型检查器可能会出现这种情况,也可能不会;也就是说,这是特定于实现的。以Mypy为例:
x1: int
x1 = 1235
reveal_type(x1) # pyright => Literal[1235]
# mypy => int
x2: int = 1235
reveal_type(x2) # pyright => Literal[1235]
# mypy => int
x3 = 1235
reveal_type(x3) # pyright => Literal[1235]
# mypy => int
x4 = 1233 + 2
reveal_type(x4) # pyright => Literal[1235]
# mypy => int
据我所知,目前没有配置来控制此行为。