提问人:pabouk - Ukraine stay strong 提问时间:7/22/2023 更新时间:7/22/2023 访问量:124
Python 中泛型函数的类型缩小
Type narrowing by a generic function in Python
问:
我需要缩小类属性的类型。它被键入为,并且不应位于代码的特定部分中。我在生成器表达式中使用此属性,因此我不能直接使用带有条件或缩小条件的范围。MyType | None
None
raise
assert
下面的代码是定义泛型类型缩小函数的正确方法吗?即将参数定义为与泛型类型结合的泛型类型,但返回类型就像泛型类型一样。None
from typing import TypeVar
ValueT = TypeVar('ValueT')
def fail_if_none(value: ValueT | None) -> ValueT:
"""Raises an exception if the value is None.
Args:
value: The value to check.
Raises:
ValueError: If the value is None.
Returns:
The value, guaranteed to not be None.
"""
if value is None:
raise ValueError("Value cannot be None.")
return value
代码是否保证返回类型将始终被视为不包括?难道没有更好的方法吗?ValueT
None
下面是一个示例,显示如何使用类型缩小函数:
def takes_int(value: int) -> int:
"""Take an int and return it."""
return value
sequence: list[int | None] = [1, 2, 3, 4, None, 5]
values1 = (takes_int(value) for value in sequence)
# error: Argument 1 to "takes_int" has incompatible type "int | None";
# expected "int" [arg-type]
values2 = (takes_int(fail_if_none(value)) for value in sequence)
# OK, no type-checker errors
我已经用 mypy 和 Pyright 测试了代码。在这两个类型检查器中,它似乎都按照我想要的方式工作。
答: 暂无答案
评论
ValueT
| None
None
(takes_int(value) for value in sequence if value is not None)