Python3.8如何精简冗余if/elif分支 减少重复代码提升可读性
优化方案
核心思路是把两种依赖类型的差异点抽成配置映射,把通用的解析逻辑统一实现,完全消除重复分支,同时兼容Python 3.8版本。
首先梳理两个分支的固定差异,其余逻辑完全一致:
- SHA1类型依赖:标记字节为
sha1_hash,ID前缀为h,ID段长度20字节(0x14),后接4字节版本号,单条总长度0x19 - GUID类型依赖:标记字节为
guid,ID前缀为g,ID段长度4字节(0x4),后接4字节版本号,单条总长度0x9
所有解析流程(读标记、解析ID整数、解析版本整数、追加到列表、推进偏移)都是通用逻辑,不需要在分支里重复写。
优化后代码
@functools.cached_property def dependencies(self): """ Get a list of dependencies. """ # 读取依赖数量 dep_count = int.from_bytes( self.__data[self.__dependency_table_offset : self.__dependency_table_offset + 4], byteorder="big", signed=True, ) dep_data = self.__data[self.__dependency_table_offset :] dependency_list = [] offset = 0x4 guid, sha1_hash = helpers.get_resource_descriptor(self.__head_revision) # 依赖类型配置映射:标记字节 -> (ID前缀, ID段字节长度) # 版本段固定为4字节,单条总长度自动计算,无需硬编码 type_config = { sha1_hash: ("h", 0x14), guid: ("g", 0x4), } for _ in range(dep_count): tag = dep_data[offset] # 跳过未识别的依赖类型(和原逻辑行为一致,可按需改成抛出异常) if tag not in type_config: break prefix, id_len = type_config[tag] # 统一计算段偏移,无需硬编码起止位置 id_start = offset + 1 id_end = id_start + id_len ver_end = id_end + 4 # 统一解析逻辑,仅一次append dep_id = f"{prefix}{int.from_bytes(dep_data[id_start:id_end], byteorder='big', signed=True)}" dep_ver = int.from_bytes(dep_data[id_end:ver_end], byteorder='big', signed=True) dependency_list.append((dep_id, dep_ver)) # 自动推进偏移 offset = ver_end return dependency_list
优化点说明
- 完全消除了if/elif分支的重复代码,新增依赖类型只需要在
type_config里加一行配置即可,不需要修改核心解析逻辑 - 去掉了原代码中无意义的切片操作
dependencies[offset:][0],直接通过下标取标记字节,执行效率更高 - 所有段偏移通过长度自动计算,不需要硬编码每个段的起止位置,后续修改字段长度时不容易写错偏移量
- 用f字符串替代字符串拼接+
str()强制转换,写法更简洁(Python 3.6+已支持,3.8完全兼容) - 把未使用的循环变量
i改成_,符合Python编码规范 - 修复了原代码的潜在风险:原逻辑遇到未识别的标记字节时offset不会推进,会导致后续解析全部错位甚至死循环,优化版可按需选择跳过/抛错,逻辑更可控
内容的提问来源于stack exchange,提问作者PRCKJzxf
相关产品推荐
相关产品推荐

