Python 3.12 + VS Code (PyLance) 没有像我期望的那样检查泛型类型

问题描述 投票:0回答:1

以下行为正常吗?

将鼠标悬停在

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

编辑#3
好的,我在这里这里找到了答案。只是

bool <: int <: float
,我当然觉得它很弱,但我理解语言本身是如何工作的。那么类型检查器是做什么的呢?类型检查器的工作不就是保护程序员免受这些类型的“错误”的影响吗?当然,我无意冒犯所做的伟大工作,只是好奇。

python visual-studio-code pylance
1个回答
0
投票

在 Python 类型系统中,bool 是 float 的子类型,因此类型检查器不会报告代码示例的错误。

© www.soinside.com 2019 - 2024. All rights reserved.