假设进行以下测试
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(撰写本文时最新版本)运行测试并将 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)
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
问题仍然存在(安全断言0.4.0)。这次,mypy 和 VS Code Pylance 都认为
foo.set_value(1)
上面两行无法访问。
我如何对 mypy 说
foo.value
已更改为 int
并且它应该继续检查 assert isinstance(foo.value, int)
行下的所有内容?
在编写问题并使用
safe_assert
时,我注意到 v.0.4.0 使用 NoReturn
作为返回类型。删除它让 mypy 很高兴。所以本质上,人们可以将其用作 safe_assert
:
def safe_assert(
expression: bool,
message: Optional[str] = None,
):
if not expression:
if message:
raise AssertionError(message)
raise AssertionError