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)。
有没有更好或更优雅的方法来处理这个问题?
我发现了两种接近非空断言运算符的方法,因此将类型转换Optional[User]为User:
typing.castfrom typing import cast
emails = [cast(User, get_user(uuid)).email for uuid in user_uuids]
Run Code Online (Sandbox Code Playgroud)
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)