如何优化生成器/迭代器迭代时指定异常的过滤跳过实现?
优化方案分析
你的现有代码已经满足核心需求,但可以从异常匹配准确性、性能和类型提示三个维度优化,同时严格保持生成器/迭代器形式:
核心优化点
直接捕获指定异常,避免全局捕获后二次判断
原代码先捕获所有Exception再检查类型,既冗余又浪费Python原生的异常匹配逻辑。改为将指定异常转成tuple后直接捕获,既能提升性能,还能自动兼容异常子类的情况(比如传入ValueError时,其子类UnicodeDecodeError也会被识别并跳过)。修复异常子类匹配漏洞
原代码用type(e) in skip_on_errors只会精确匹配异常类型,无法识别继承自指定类型的子类异常。而except tuple(skip_excs)遵循Python的异常继承匹配规则,更符合常规业务预期。增强类型提示精确性
通过泛型类型变量,让函数的输入输出类型关联更明确,方便类型检查工具(如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
相关产品推荐
相关产品推荐

