我有这个代码
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)。
这是
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 论坛上提出它。