Python中如何解决yield from报错问题

遇到一个问题,我再看书的过程中,看到 yield from 语法,想尝试一下,然后就输入了书上的例子,然后编译器提示 yield from 语法报错了:

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)): for x in items: if isinstance(x, Iterable) and not isinstance(x, ignore_types): yield from flatten(x) else: yield x

报错提示是 yield 语法有问题:

yield from flatten(x)
       ^
SyntaxError: invalid syntax

经过一番 google,有人提出升级 setuptools 能解决,可是我执行了 pip install --upgrade setuptools pip 升级之后,依然有这样的报错提示。我的环境是 mac,pyhon 2.7,这里的问题该如何解决呢?


Python中如何解决yield from报错问题

18 回复

3 的语法放在 pyhon 2.7 里用了


yield from 报错通常是因为你错误地使用了这个语法。最常见的问题是 yield from 后面跟的不是一个可迭代对象或生成器。

核心原因和解决方案:

  1. 确保 yield from 后面是可迭代对象

    # 错误示例
    def wrong():
        yield from 123  # 整数不可迭代,会报错
    
    # 正确示例
    def right():
        yield from [1, 2, 3]  # 列表可迭代
        yield from range(3)   # range对象可迭代
        yield from (x for x in range(3))  # 生成器表达式可迭代
    
  2. 正确处理嵌套生成器

    def sub_generator():
        yield 1
        yield 2
    
    def main_generator():
        yield from sub_generator()  # 正确:传递子生成器的所有值
        yield 3
    
    # 使用
    for value in main_generator():
        print(value)  # 输出: 1, 2, 3
    
  3. 检查语法错误

    • Python 3.3+ 才支持 yield from
    • 确保在函数定义内使用(不能直接在模块层级使用)

完整示例:

def flatten(nested_list):
    """展平嵌套列表"""
    for item in nested_list:
        if isinstance(item, list):
            yield from flatten(item)  # 递归展平
        else:
            yield item

# 使用示例
nested = [1, [2, [3, 4], 5], 6]
print(list(flatten(nested)))  # 输出: [1, 2, 3, 4, 5, 6]

一句话建议: 检查 yield from 后面的对象是否可迭代,并确保在Python 3.3+环境中运行。

请看 python3

能在 2 里面调用 python3 的语法吗?我记得原来好像看到过。不知道有没有记错。


from future import xxxxxxx

如果我想在 python 2.7 里面用,该怎么办呢?

#5 这种语法 2.7 肯定用不了啊,否则 3 和 2.7 的兼容问题不是被你解决了

yield from 是没法在 2 里用的

看到标题我就感觉是在 2 里面跑了,果然。。。

自己把 python2 的源码拿来修改,自己实现 yield from 语法,然后用自己的 python2,除此,无他。

移植到 py2,只能用 for 了

Python 2 不支持 yield from。

其实我觉得是时候投向 Python 3 了,除非你有老项目的历史包袱。

P.S. yield from xx 等价于

for x in xx: yield x

书都是 python3 的书,还用 python2 的解释器

书上没写,没指明,一直用的 python 2.7,之前写的很多项目都是 2.7 的。在考虑中迁移。

谢谢,在考虑迁移。

python2.x 和 python3 是两种语言

早日投奔 py3,不受苦
前一阵为了给新服务器同时兼容 2 和 3 费了半天劲

回到顶部