问题描述
假设下面的测试
class Foo:
def __init__(self):
self.value: int | None = None
def set_value(self, value: int | None):
self.value = value
def test_foo():
foo = Foo()
assert foo.value is None
foo.set_value(1)
assert isinstance(foo.value, int)
assert foo.value == 1 # unreachable
测试:
- 首先,判断
foo.value
是否等于某个值 - 然后,使用方法设置值.
- 然后判断
foo.value
是否改变了.
当使用mypy版本1.9.0运行测试(最新版本在 compose 本文时),并将warn_unreachable设置为True时,会得到:
(venv) niko@niko-ubuntu-home:~/code/myproj$ python -m mypy tests/test_foo.py
tests/test_foo.py:16: error: Statement is unreachable [unreachable]
Found 1 error in 1 file (checked 1 source file)
我所发现的
- 在mypy GitHub中有一个开放的问题:https://github.com/python/mypy/issues/11969一条 comments 说使用safe-assert,但在重写测试后,
from safe_assert import safe_assert
def test_foo():
foo = Foo()
safe_assert(foo.value is None)
foo.set_value(1)
safe_assert(isinstance(foo.value, int))
assert foo.value == 1
问题仍然存在(safe—assert 0.4.0). 这一次,mypy和VS Code Pylance都认为上面的foo.set_value(1)
两行是无法达到的.
问题
我怎么能对mypy说,foo.value
已经变成了int
,它应该继续判断assert isinstance(foo.value, int)
线以下的所有东西?