《笨办法学Python》第48题:为字典键添加多值的代码重构问询
Hey there! 既然你已经顺利完成《笨办法学Python》第48题的基础实现,现在想给代码做个“瘦身美容”(重构),那咱们就结合这个词法分析器的场景,聊聊几个实用的重构方向~
针对第48题词法分析器的重构建议
1. 把重复判断逻辑抽成独立小函数
原实现里大概率会有一堆重复的类型判断(比如检查数字、方向词、动词),把这些逻辑拆成单独函数,能让主代码逻辑更清爽,也方便后续修改。举个例子:
def is_number(token: str) -> bool: try: int(token.lower()) return True except ValueError: return False def is_direction(token: str) -> bool: return token.lower() in {'north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back'}
2. 用字典映射替代冗长的if/elif分支
原来的代码可能会有一大串if token == 'xxx'的判断,换成字典映射不仅更简洁,后续加新词汇也更方便:
def get_token_type(token: str) -> str: token_lower = token.lower() # 把固定词汇和类型的映射统一放在这里 type_map = { **{dir: 'direction' for dir in {'north', 'south', 'east'}}, **{verb: 'verb' for verb in {'go', 'stop', 'kill', 'eat'}}, **{stop: 'stop' for stop in {'the', 'in', 'of'}} } if is_number(token_lower): return 'number' if token_lower in type_map: return type_map[token_lower] # 按题目要求,未匹配的词归为名词或错误 return 'noun'
3. 拆分主函数为单一职责的小单元
把“拆分输入字符串”和“识别每个词的类型”拆成两个独立函数,符合单一职责原则,代码可读性和复用性都会提升:
from typing import List, Tuple def split_input(input_str: str) -> List[str]: """拆分输入字符串为单个词汇""" return input_str.strip().split() def scan(input_str: str) -> List[Tuple[str, str | int]]: """核心词法分析函数""" tokens = split_input(input_str) result = [] for token in tokens: token_type = get_token_type(token) # 数字类型要转成整数,其他保持原字符串 value = int(token) if token_type == 'number' else token result.append((token_type, value)) return result
4. 把固定词汇集合抽成全局常量
把方向、动词、停止词这些固定的词汇集合,放在文件顶部作为常量定义,后续要新增或修改词汇时,直接改常量就行,不用动逻辑代码:
# 全局常量,统一管理固定词汇 DIRECTIONS = {'north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back'} VERBS = {'go', 'stop', 'kill', 'eat'} STOP_WORDS = {'the', 'in', 'of', 'from', 'at', 'it'} NOUNS = {'door', 'bear', 'princess', 'cabinet'}
5. 用测试保障重构正确性
因为题目已经提供了lexicon_tests.py,重构完成后一定要跑一遍测试,确保所有assert_equal都通过,避免重构引入bug。在终端执行:
python lexicon_tests.py
如果能把你当前的代码贴出来,我还可以给你更针对性的重构建议哦~
内容的提问来源于stack exchange,提问作者Bill LaLonde
相关产品推荐
相关产品推荐

