以下行为正常吗?
将鼠标悬停在
Prop
或 name
或 value
上显示类型已正确识别,因此 value
是 float
,但设置 value = True
似乎并不困扰 Pylance。 [好的,请参阅下面的编辑#3]
[系统:Windows 11、Python 3.12.x、最新的 VS Code,设置看起来配置合理]
编辑#1 好吧,我不常使用 Python,但我也曾多次陷入这个困境。发生这种情况是因为布尔值可以转换为浮点数(
float(True) == 1.0
是 true),对吧?现在好吧,我知道 bool 在 python 中定义得不是很严格,但是严格模式下的类型检查器不应该标记这一点吗?对于明显不兼容的类型,Pylance 按预期工作,例如:
编辑#2
这是文本代码(根据评论中的要求。发布图片是为了突出显示类型检查器标志的存在或缺失):
class Prop[T]:
def __init__(self, name: str, value: T) -> None:
self.name: str = name
self.value: T = value
self._type = type(value)
prop_noflag = Prop[float]('name', True) # no flag
prop_flag = Prop[float]('name', 'some_string') # flag
bool <: int <: float
,我当然觉得它很弱,但我理解语言本身是如何工作的。那么类型检查器是做什么的呢?类型检查器的工作不就是保护程序员免受这些类型的“错误”的影响吗?当然,我无意冒犯所做的伟大工作,只是好奇。
在 Python 类型系统中,bool 是 float 的子类型,因此类型检查器不会报告代码示例的错误。