mypy `type(x) is y` 不会缩小值

mypy `type(x) is y` does not narrow values

我有这个代码

class Base:
    pass


class Foo(Base):
    foo: str


def bar(x: Base):
    if type(x) is Foo:
        return x.foo
    return ""

mypy 给我这个错误

$ mypy cast.py
cast.py:11: error: "Base" has no attribute "foo"
Found 1 error in 1 file (checked 1 source file)

在文档中,mypy 似乎支持 type(x) is y 缩小类型,文档位于 https://mypy.readthedocs.io/en/latest/type_narrowing.html#type-narrowing-expressions

我仍然有这个错误。我可以使用 isinstance(x, y)isinstance 在最坏的情况下效率低于 type(x) is y (我在代码中有很多)。我也可以用演员表来修复它,这对我来说是不受欢迎的噪音:

def bar(x: Base):
    if type(x) is Foo:
        return cast(Foo, x).foo

所以今天我用 # type: ignore 忽略了这个错误,这也很不理想

您使用的似乎是旧版本 mypyappears to be 2021 年 4 月在 0.812 和 0.900 版本之间添加了使用 type 添加 type-narrowing 的拉取请求。 mypy 的较新版本,至少,按照记录工作。

$ mypy --version
mypy 0.930

$ mypy tmp.py
Success: no issues found in 1 source file