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

Python中检查JSON文件内命令是否存在及代码故障调试求助

修复你的命令匹配代码

我看了你的代码,核心问题出在循环里的条件判断逻辑,导致永远无法匹配到正确的命令。咱们一步步拆解问题:

主要问题点

  • 错误的存在性检查:if Command in data['commands']这行逻辑完全不对。data['commands']是包含字典的列表,而Command是字符串,两者类型不匹配,这个条件永远返回False,所以代码永远走不到命令匹配的分支,直接输出错误信息。
  • else分支位置错误:当前else放在循环内部,意味着只要有一个命令不匹配就立刻输出错误,但实际上应该等遍历完所有命令都没找到时,才输出错误提示。
  • 冗余的重复判断:Command.lower() == p['commandName']已经做了匹配校验,前面的存在性检查完全多余。
  • 缺失目标函数:代码里调用eval(p["function"] + '()'),但没有定义对应的print函数(还会和内置print冲突),运行时会直接报错。

修复后的代码

import json

def print_help():
    # 自定义帮助函数,避免和内置print冲突
    print("Help command executed! Available commands: help")

def login():
    print("Oof")
    # 提前读取JSON文件,避免每次输入都重复读取
    with open("data.json") as json_file:
        data = json.load(json_file)
    
    while True:
        command = input(">").lower()  # 提前转小写,减少重复转换操作
        command_found = False
        
        for cmd_info in data['commands']:
            if command == cmd_info['commandName']:
                # 用函数映射替代eval,更安全
                function_map = {
                    "print": print_help
                }
                function_map[cmd_info["function"]]()
                command_found = True
                break  # 找到匹配命令后直接退出循环
        
        if not command_found:
            print(f"Command '{command}' does not exist, try 'help'.")

# 启动程序
login()

额外优化建议

  1. 替换eval:eval存在严重安全风险,如果JSON文件被篡改,可能会执行恶意代码。用字典映射函数的方式更安全可控。
  2. 代码规范:Python变量和函数名建议遵循PEP8规范,用小写加下划线命名(比如Command改成command,p改成cmd_info),可读性更强。
  3. 提前读取资源:把JSON文件读取放在循环外部,不需要每次用户输入都重新加载文件,节省系统资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:57:33