在Python中,当将一个由Optional个值组成的序列收集到IterableList中,同时过滤出None个值时,如何向类型判断器表示结果Iterable的元素类型不再是Optional,并且列表不包含None

举个例子:

def a(i: InputType) -> Optional[ResultType]:
   ...

def b(is: List[InputType]) -> Iterable[ResultType]:
    return filter(partial(is_not, None), (a(x) for x in is))

类型判断器(在我的例子中是Pyright)抱怨我无法将潜在的None值放入Iterable[ScanFileResult]返回类型中.但是,因为我要过滤掉它,所以我需要一些方法来断言,以向类型判断器证明元素类型不再是Optional[ResultType],而只是ResultType.做这件事最干净的方式是什么?

推荐答案

根据@MateenUlhaq在 comments 中的建议,你面临的问题可能是由于使用filter(partial(is_not, None))使得语言服务器很难推断出ots返回值的类型.

你可以通过过滤掉开头的None来让它变得更容易. 以下是一个示例:

def a(x: int) -> int | None:
    if x % 2 == 0:
        return x
    return None

def b(xs: list[int]):
    print(sum(xs))

xs = [ax for x in range(10) if (ax:=a(x)) is not None]
b(xs)

pyright并没有抱怨,因为它可以推断出xs的类型是list[int]

将这一点应用到您的特定 case 中,您会得到如下结果:

def b(inputs: List[InputType]) -> Iterable[ResultType]:
    return (ax for x in inputs if (ax:=a(x)) is not None)

这在Python3.10+版上有效(因为它使用:=运算符).

Python相关问答推荐

为什么自定义pytree aux_data对于jnp.数组来说在.jit()之后跟踪,而对于np.数组来说则不是?

为什么使用SciPy中的Distance. cos函数比直接执行其Python代码更快?

Pandas 按照特殊规则保留每n行

根据多列和一些条件创建新列

将嵌套列表的字典转换为数据框中的行

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

Pandas 除以一列中出现的每个值

通过仅导入pandas来在for循环中进行多情节

在Python和matlab中显示不同 colored颜色 的图像

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

根据条件将新值添加到下面的行或下面新创建的行中

如何将ctyles.POINTER(ctyles.c_float)转换为int?

对于一个给定的数字,找出一个整数的最小和最大可能的和

如何让Flask 中的请求标签发挥作用

如何使用数组的最小条目拆分数组

无法使用requests或Selenium抓取一个href链接

多处理队列在与Forking http.server一起使用时随机跳过项目

如何在Python中使用Pandas将R s Tukey s HSD表转换为相关矩阵''

使用BeautifulSoup抓取所有链接

dask无groupby(ddf. agg([min,max])?''''