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

Python类方法返回generator object问题排查求助

生成器对象输出的原因及修复方案

问题原因

你看到的<generator object Category._get_subcat at ...>是因为方法返回了生成器对象而非实际数据,核心问题出在两个地方:

  1. _get_subcat方法使用了yield from,这会让方法成为生成器函数,调用时不会直接返回结果,而是返回一个生成器迭代器。
  2. 在_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:45:38