You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化生成器/迭代器迭代时指定异常的过滤跳过实现?

优化方案分析

你的现有代码已经满足核心需求,但可以从异常匹配准确性、性能和类型提示三个维度优化,同时严格保持生成器/迭代器形式:

核心优化点

  1. 直接捕获指定异常,避免全局捕获后二次判断
    原代码先捕获所有Exception再检查类型,既冗余又浪费Python原生的异常匹配逻辑。改为将指定异常转成tuple后直接捕获,既能提升性能,还能自动兼容异常子类的情况(比如传入ValueError时,其子类UnicodeDecodeError也会被识别并跳过)。

  2. 修复异常子类匹配漏洞
    原代码用type(e) in skip_on_errors只会精确匹配异常类型,无法识别继承自指定类型的子类异常。而except tuple(skip_excs)遵循Python的异常继承匹配规则,更符合常规业务预期。

  3. 增强类型提示精确性
    通过泛型类型变量,让函数的输入输出类型关联更明确,方便类型检查工具(如mypy)识别,提升代码可维护性。

优化后的代码

from typing import Iterable, Callable, Iterator, Type, Exception, TypeVar

T = TypeVar('T')
R = TypeVar('R')

def yield_or_skip(iter_: Iterable[T], func: Callable[[T], R], skip_on_errors: Iterable[Type[Exception]]) -> Iterator[R]:
    skip_excs = tuple(skip_on_errors)
    for item in iter_:
        try:
            yield func(item)
        except skip_excs:
            continue

额外说明

  • 若skip_on_errors为空,转成空tuple后,except ()不会捕获任何异常,异常会正常向上抛出,符合预期。
  • 该实现完全保持生成器形式,不会将结果存入列表,满足你的约束条件。

内容的提问来源于stack exchange,提问作者Rizhiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:10