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
忽略了这个错误,这也很不理想
您使用的似乎是旧版本 mypy
; appears 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
我有这个代码
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
忽略了这个错误,这也很不理想
您使用的似乎是旧版本 mypy
; appears 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