是否有一种内联方法来断言某个值不是 None?

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

我有这个代码

if foo:
    bar = 1
else:
    bar = maybe_return_int(baz)

maybe_return_int
的返回类型是
Optional[int]
,所以mypy抱怨

error: Incompatible types in assignment (expression has type "int | None", variable has type "int")  [assignment]

但是,在我的代码上下文中,我知道

maybe_return_int(baz)
永远不会返回
None
。为了让它进行类型检查,我必须写这个曲折的东西:

if foo:
    bar = 1
else:
    bar_maybe_none = maybe_return_int(baz)
    assert bar_maybe_none is not None
    bar = bar_maybe_none

有没有更短的写法?如果有一个

assert_not_none
函数我可以这样使用:

if foo:
    bar = 1
else:
    bar = assert_not_none(maybe_return_int(baz))

我可以写这样一个

assert_not_none
函数吗?

我可以使用强制转换,但我喜欢断言实际上会执行检查(至少在未禁用断言时),并且使用断言我不必编写类型(在我的真实代码中,这是一个更冗长的事情)类型不仅仅是一个 int)。

python python-typing mypy
1个回答
0
投票

这是

assert_not_none
的实现:

from typing import TypeVar, Optional

T = TypeVar("T")

def assert_not_none(value: Optional[T]) -> T:
    assert value is not None
    return value

根据上述内容,进行以下代码类型检查:

if foo:
    bar = 1
else:
    bar = assert_not_none(maybe_return_int(baz))

感觉在一些常见的地方(例如 stdlib

typing
模块)实现这一点会很有用,但据我所知还不是这样。我可能会在 Python Ideas Discourse 论坛上提出它。

© www.soinside.com 2019 - 2024. All rights reserved.