在方法中设置属性值时,如何使用mypy解决“Statement is unreachable [unreachable]”问题?

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

问题描述

假设进行以下测试

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)
行下的所有内容?

python mypy
1个回答
0
投票

在编写问题并使用

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
© www.soinside.com 2019 - 2024. All rights reserved.