Python异步代码问题:从JSON文件查找p1属性相同的用户名称
问题分析与修正代码
原代码存在的问题
get_json被定义为异步函数,但内部是同步文件操作,使用await会引发错误,无需设为异步。- 循环中使用
return会直接返回第一个匹配的用户名称,无法收集所有符合条件的用户。 - 遍历
users时,user本身就是JSON中的字符串键,无需用str(user)转换。 - 未处理输入用户
user1.id不存在于JSON中的情况,可能触发KeyError。
修正后的代码
同步版本(适合新手,无额外依赖)
import json def get_json(): with open("the json file", "r") as f: users = json.load(f) return users def find_common_p1(user1): users = get_json() # 处理用户ID不存在的情况 user1_id = str(user1.id) if user1_id not in users: return [] target_p1 = users[user1_id]["p1"] # 收集所有p1值匹配的用户名称 matching_names = [] for user_data in users.values(): if user_data["p1"] == target_p1: matching_names.append(user_data["name"]) return matching_names
异步版本(需异步场景时使用)
如果必须用异步文件操作,需安装aiofiles库,代码如下:
import aiofiles import json async def get_json(): async with aiofiles.open("the json file", "r") as f: content = await f.read() users = json.loads(content) return users async def find_common_p1(user1): users = await get_json() user1_id = str(user1.id) if user1_id not in users: return [] target_p1 = users[user1_id]["p1"] matching_names = [] for user_data in users.values(): if user_data["p1"] == target_p1: matching_names.append(user_data["name"]) return matching_names
代码说明
- 同步/异步适配:新手优先用同步版本,无需额外依赖;异步版本适合有IO异步需求的场景。
- 错误防护:先检查输入用户ID是否存在于JSON中,避免键不存在的报错。
- 高效匹配:提前获取目标
p1值,避免循环中重复查找。 - 结果收集:用列表存储所有匹配的用户名称,返回完整结果而非单个值。
内容的提问来源于stack exchange,提问作者user20124814
相关产品推荐
相关产品推荐

