Python类方法返回generator object问题排查求助
生成器对象输出的原因及修复方案
问题原因
你看到的<generator object Category._get_subcat at ...>是因为方法返回了生成器对象而非实际数据,核心问题出在两个地方:
_get_subcat方法使用了yield from,这会让方法成为生成器函数,调用时不会直接返回结果,而是返回一个生成器迭代器。- 在
_get_subcatdes方法中,你直接yield了_get_subcat的返回值(即生成器对象),而没有展开生成器内部的元素,导致最终收集到的列表里包含生成器对象,而非预期的元组数据。
另外,方法的类型标注存在矛盾:比如_get_subcat标注返回tuple[tuple, ...],但实际因使用yield返回的是Iterator[tuple],会导致类型检查工具报错。
修复方案
1. 修正_get_subcatdes的yield逻辑
把yield cls._get_subcat(...)改为yield from cls._get_subcat(...),展开生成器中的所有元素,逐个yield出来:
@classmethod def _get_subcatdes(cls, data: Iterable[dict[str, Any]]) -> Iterator[tuple]: for item in data: if item['subcategoryId'] == cls.SUBCATEGORY: # 替换yield为yield from,展开生成器元素 yield from cls._get_subcat(item['offerSubcategory'].get('offers'))
2. 修正方法类型标注
将所有使用yield的生成器方法的返回类型从tuple[tuple, ...]改为Iterator[tuple],保持标注与实际返回值一致:
@classmethod def _get_records(cls, data: Iterable[dict[str, Any]]) -> Iterator[tuple]: for item in data: if item['offerCategoryId'] == cls.CATEGORY: yield from cls._get_subcatdes(item['offerSubcategoryDescriptors']) @classmethod def _get_subcatdes(cls, data: Iterable[dict[str, Any]]) -> Iterator[tuple]: for item in data: if item['subcategoryId'] == cls.SUBCATEGORY: yield from cls._get_subcat(item['offerSubcategory'].get('offers')) @classmethod def _get_subcat(cls, data: Iterable[dict[str, Any]]) -> Iterator[tuple]: for item in data: for x in item: if x.get('isOpen', False): # 将默认值改为False,符合isOpen布尔类型的预期 yield from cls._get_data(x['outcomes'])
3. 优化isOpen判断逻辑
_get_subcat中x.get('isOpen',())的默认值用空元组不合适,isOpen是布尔类型,改为x.get('isOpen', False)可避免非布尔值导致的判断错误。
验证效果
修改后,调用to_dict方法时会正确遍历所有生成器元素,将它们收集为列表中的元组,打印时就能看到实际业务数据,而非生成器对象。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

