如何对位置与关键字参数中的可迭代对象执行zip操作并逐次调用函数
解决方案
核心思路是先固定关键字参数的键顺序,将位置参数和关键字参数对应的所有迭代器合并后统一做zip操作,每次循环拆分结果为位置参数值和关键字参数值即可。
完整实现代码如下:
from itertools import repeat # 预处理位置参数迭代器 args_iters = [ a.iterable if isinstance(a, SpecialType) else repeat(a) for a in args ] # 预处理关键字参数,先固定键顺序避免映射出错 kwarg_keys = list(kwargs.keys()) kwarg_iters = [ kwargs[k].iterable if isinstance(kwargs[k], SpecialType) else repeat(kwargs[k]) for k in kwarg_keys ] # 合并所有迭代器统一zip,Python3.10+可加strict=True校验长度一致 for batch_values in zip(*args_iters, *kwarg_iters): # 拆分批次值为位置参数和关键字参数 current_args = batch_values[:len(args)] current_kwargs = dict(zip(kwarg_keys, batch_values[len(args):])) # 执行目标函数 this_result = func(*current_args, **current_kwargs) # 后续可添加结果存储逻辑用于构建新树
关键说明
- 显式提取
kwarg_keys固定键顺序,即使在不保证字典保序的Python版本中也能正确映射关键字参数 - 所有
SpecialType迭代器长度一致,非特殊参数用repeat包装为无限迭代器,zip时会自动匹配最短的特殊迭代器长度,符合需求 - Python3.10及以上版本可给
zip添加strict=True参数,一旦出现迭代器长度不一致的情况会直接抛出异常,能提前拦截逻辑错误
内容的提问来源于stack exchange,提问作者ThomasNicholas
相关产品推荐
相关产品推荐

