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

《笨办法学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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:24