处理Python中缺少非空断言运算符的问题

Gar*_*ett 10 python mypy python-typing

我想允许 Mypy'strict_optional标志。但是,请考虑一下:

emails = [get_user(uuid).email for uuid in user_uuids]
Run Code Online (Sandbox Code Playgroud)

理论上get_user可以返回None,但在这个用例中,我知道它不能(如果确实如此,我也可以得到异常)。这必须变成:

emails = []
for uuid in user_uuids:
    user = get_user(uuid)
    assert user is not None
    emails.append(user.email)
Run Code Online (Sandbox Code Playgroud)

在 TypeScript 中,有一个非空断言运算符,它允许您仅添加 a !(如getUser(uuid)!.email)。

有没有更好或更优雅的方法来处理这个问题?

Gar*_*ett 8

我发现了两种接近非空断言运算符的方法,因此将类型转换Optional[User]User

1)使用typing.cast

from typing import cast

emails = [cast(User, get_user(uuid)).email for uuid in user_uuids]
Run Code Online (Sandbox Code Playgroud)

2)用函数模仿非空断言

from typing import TypeVar

T = TypeVar('T')

def not_none(obj: Optional[T]) -> T:
    assert obj is not None
    return obj

emails = [not_none(get_user(uuid)).email for uuid in user_uuids]
Run Code Online (Sandbox Code Playgroud)