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

如何基于字典实现Python Adder REPL的命令动态匹配

实现思路
  • 首先用字典存储所有变量:你不需要给每个变量单独定义变量,直接用一个variables = {}字典统一管理,键是变量名(字符串),值是对应的整数值,存取都很方便。
  • 拆分用户输入做结构化解析:把每次用户输入的字符串按空格切割为标记列表(tokens),根据tokens的长度、关键词位置判断属于哪类命令,不需要硬编码每一条可能的输入。
  • 命令映射表优化:你原来的命令字典思路可以升级为「命令关键词->处理函数」的映射,不同类型的命令对应不同的处理逻辑,代码结构更清晰。
具体实现代码
def get_val(val_str: str, variables: dict) -> tuple[bool, int|str]:
    """
    解析val的值,返回(是否成功获取到值, 数值/错误提示)
    """
    # 先尝试转数字
    try:
        return True, int(val_str)
    except ValueError:
        # 不是数字,查变量
        if val_str in variables:
            return True, variables[val_str]
        else:
            return False, f"{val_str} is undefined."

def input_loop():
    variables = {}
    print("Welcome to the Adder REPL.")
    while True:
        user_input = input("??? ").strip()
        tokens = user_input.split()
        # 空输入跳过
        if not tokens:
            continue
        
        # 匹配命令类型
        if len(tokens) == 1:
            # 只有quit命令是单token
            if tokens[0] == 'quit':
                print("Goodbye.")
                break
            else:
                print("Syntax error.")
        elif len(tokens) == 2:
            cmd, arg = tokens
            if cmd == 'input':
                # 校验变量名合法
                if not arg.isalpha():
                    print("Syntax error.")
                    continue
                val = input(f"Enter a value for {arg}: ")
                # 输入值转int存储
                variables[arg] = int(val)
            elif cmd == 'print':
                ok, res = get_val(arg, variables)
                if ok:
                    # 判断是数字还是变量
                    if arg.isalpha():
                        print(f"{arg} equals {res}")
                    else:
                        print(res)
                else:
                    print(res)
            else:
                print("Syntax error.")
        elif len(tokens) == 3:
            var, op, val_str = tokens
            # 校验左边是合法变量名,操作符是gets/adds
            if not var.isalpha() or op not in ('gets', 'adds'):
                print("Syntax error.")
                continue
            # 取右边的值
            ok, val = get_val(val_str, variables)
            if not ok:
                print(val)
                continue
            if op == 'gets':
                variables[var] = val
            elif op == 'adds':
                # 变量未定义时默认初始值为0
                variables[var] = variables.get(var, 0) + val
        else:
            print("Syntax error.")

if __name__ == "__main__":
    input_loop()
可选优化方案

你原本构想的命令字典可以进一步封装处理逻辑,后续扩展命令时不需要修改主循环的判断逻辑,只需要新增命令对应的处理函数和映射关系即可,示例如下:

# 命令处理函数封装示例
def handle_quit(tokens, variables):
    print("Goodbye.")
    return False # 返回False表示终止循环

def handle_input(tokens, variables):
    if len(tokens) !=2 or not tokens[1].isalpha():
        print("Syntax error.")
        return True
    arg = tokens[1]
    val = input(f"Enter a value for {arg}: ")
    variables[arg] = int(val)
    return True

# 命令映射表
command_handlers = {
    'quit': handle_quit,
    'input': handle_input,
    # 其他命令对应的处理函数依次添加即可
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:15:03