如何基于字典实现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
相关产品推荐
相关产品推荐

