You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 同步/异步适配:新手优先用同步版本,无需额外依赖;异步版本适合有IO异步需求的场景。
  2. 错误防护:先检查输入用户ID是否存在于JSON中,避免键不存在的报错。
  3. 高效匹配:提前获取目标p1值,避免循环中重复查找。
  4. 结果收集:用列表存储所有匹配的用户名称,返回完整结果而非单个值。

内容的提问来源于stack exchange,提问作者user20124814

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:45:42