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报错问题
3 的语法放在 pyhon 2.7 里用了
yield from 报错通常是因为你错误地使用了这个语法。最常见的问题是 yield from 后面跟的不是一个可迭代对象或生成器。
核心原因和解决方案:
-
确保 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)) # 生成器表达式可迭代 -
正确处理嵌套生成器
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 -
检查语法错误
- Python 3.3+ 才支持
yield from - 确保在函数定义内使用(不能直接在模块层级使用)
- Python 3.3+ 才支持
完整示例:
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 里用的
自己把 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 费了半天劲


