Python 3.7生成器函数未执行求助:调用后未进入函数体
问题分析与解决办法
嘿,我一眼就看出问题出在哪了——这是Python生成器函数的特性在“搞鬼”!
你遇到的现象完全符合生成器的工作逻辑:生成器函数在被调用时,并不会立刻执行函数内部的代码,它只会返回一个生成器对象。只有当你对这个生成器对象进行迭代操作(比如用for循环遍历、调用next()方法,或者把它转换成列表)时,函数里的代码才会逐步跑起来。
你的代码问题点
你现在只是执行了这行代码:
iter_elements_by_name_please('test.xml', 'gabm')
这仅仅是创建了一个生成器对象,但根本没去迭代它,所以函数里的print('It works')、ET.iterparse()这些逻辑完全不会触发,看起来就像“没进入函数”一样。而当你删掉for循环后,函数里没有了yield语句,它就不再是生成器函数了,调用时会直接执行所有代码,所以能正常运行。
怎么修复?
你只需要对生成器对象做迭代操作就行,给你两种常用的方式:
- 用
for循环遍历(推荐,内存友好,适合大XML文件):
# 调用函数并遍历生成器,处理每个匹配的元素 for elem in iter_elements_by_name_please('test.xml', 'gabm'): # 这里可以添加你的处理逻辑,比如打印元素内容 print(f"找到匹配元素: {elem.tag}")
- 转换成列表(适合小XML文件,方便一次性获取所有结果):
# 把生成器转换成列表,触发函数执行 matched_elements = list(iter_elements_by_name_please('test.xml', 'gabm')) print(f"共找到 {len(matched_elements)} 个匹配元素")
另外提个小细节:你的函数参数handle传的是文件名字符串,ET.iterparse()是支持直接接收文件名的,这部分没问题,不用改。
验证效果
当你加上迭代操作后,再运行代码,你会看到It works被打印出来,for循环里的逻辑也会正常处理XML里的元素了。
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

