Python生成器send传入数据未存入字典,求代码调整方案
问题分析与解决
你的代码存在两个核心问题,导致send('Jane,35')传入的数据没有存入guests字典:
- 生成器未捕获
send传入的值:原代码里的yield line_data仅负责输出数据,没有接收send方法传递的输入值,所以你传入的字符串根本没进入生成器的处理流程。 yield位置逻辑错误:原代码读取文件行后立刻执行yield,后续的字典存入逻辑只处理文件读取的内容,send传入的值无法被这部分逻辑处理。
修复方案
调整生成器逻辑,让它能接收并处理send传入的数据:
guests = {} def read_guestlist(file_name): text_file = open(file_name,'r') line_data = None while True: # 接收send传入的值,首次next()启动时返回None line_data = yield line_data # 优先处理send传入的有效数据 if line_data and ',' in line_data: processed_data = line_data.strip().split(",") else: # 无传入数据时读取文件行 processed_data = text_file.readline().strip().split(",") if len(processed_data) < 2: text_file.close() break name, age = processed_data[0], int(processed_data[1]) guests[name] = age guestlist = read_guestlist('guest_list.txt') # 首次调用next()启动生成器,走到yield处等待输入 next(guestlist) # 读取文件前10行 for _ in range(10): next(guestlist) # 传入Jane的数据并触发处理 guestlist.send('Jane,35')
关键修改说明
- 将
yield改为line_data = yield line_data,让生成器能捕获send传入的值,作为当前循环的处理对象。 - 增加优先级判断:如果有
send传入的有效数据,优先处理该数据;否则继续读取文件行。 - 首次启动生成器必须调用一次
next(),让生成器执行到yield语句处,才能接收后续的send输入。
修改后,guests字典中会成功添加'Jane': 35的键值对。
内容的提问来源于stack exchange,提问作者J J
相关产品推荐
相关产品推荐

