据我所知,Python是一种渐进式打字语言。所有未注释的变量的类型都是Any
任何类型的超类型和子类型。那么为什么下面的代码会被静态类型检查器拒绝呢?
def doubles(x: str) -> str:
return x + x
y = True
doubles(y)
我知道该程序显然是不正确的,但是类型检查器是如何猜测的?不应该发生以下情况吗:
y
没有注释,因此它是 Any 类型- 投射
Any
到str
- 接受程序
仅当您显式指定类型时,才会出现预期的行为Any
。我假设在没有明确指定 的情况下Any
,y
将被分配正确表达式的类型,即 ,bool
但是我们将无法将 的值更改y
为123
type int
,这是不正确的
静态类型检查系统还将“查看”源代码中实际分配的值。事实上,将采用分配值的类型给未注释的变量。
在您的示例中,它“看到”就像我们可以做的那样,
y
包含一个bool
. 即使y
被注释为 beingbool | str
,在这种情况下它也会看到实际包含的值是 bool 。(但它实际上抱怨更广泛的类型)。此外,它不允许简单地“更广泛”的值适应更窄的带注释的调用:即使您注释
y
为“any”,在运行时从静态类型系统无法“看到”的地方获取其值,它也会可以通过这样的调用警告您:doubles
需要一个str
参数(但它实际上允许它,至少是 mypy)。