Python如何去除图片文件名解析逻辑中的冗余if-elif-else分支?
优化方案:通过规则配置表消除冗余分支
核心思路是把不同文件名格式的取值逻辑抽象为可配置的规则集合,程序仅需遍历规则匹配当前场景即可,无需编写大量if-elif分支,同时100%保留原有功能。
优化思路说明
- 先把所有字段初始化为默认值
unknown,避免每个分支重复赋值相同默认值 - 把原有每个分支的「匹配条件」和「字段取值规则」统一存入规则表
- 遍历规则表找到第一个匹配的规则,按规则为对应字段赋值
- 无匹配规则时保留原有的打印文件名逻辑
优化后代码
import re def parseimage(img): strip = img.strip('\n') parts = re.split("[_.]+", strip) # 初始化所有字段为默认值 camera = timestamp = numberplate = lane = vehicletype = country = ADRnumber = "unknown" # 规则表:(匹配条件, 字段取值映射),按原有分支优先级排序 rules = [ # 对应原len==11的分支 ( lambda p, i: len(p) == 11, { 'country': lambda p: p[-3], 'vehicletype': lambda p: p[-5], 'lane': lambda p: p[-4], 'numberplate': lambda p: p[-6], 'timestamp': lambda p: p[-7], 'camera': lambda p: f"{p[-9]}-{p[-8]}" } ), # 对应原len==10的分支 ( lambda p, i: len(p) == 10, { 'country': lambda p: p[-2], 'vehicletype': lambda p: p[-3], 'lane': lambda p: p[-4], 'numberplate': lambda p: p[-5], 'timestamp': lambda p: p[-6], 'camera': lambda p: f"{p[-8]}-{p[-7]}" } ), # 对应原len==7的分支 ( lambda p, i: len(p) == 7, { 'country': lambda p: p[-2], 'vehicletype': lambda p: p[-3], 'camera': lambda p: p[-4], 'lane': lambda p: p[-5], 'numberplate': lambda p: p[-6], 'timestamp': lambda p: p[-7] } ), # 对应原len==5且含61-101/62-101的分支 ( lambda p, i: len(p) == 5 and ('_61-101_' in i or '_62-101_' in i), { 'country': lambda p: p[-2], 'camera': lambda p: p[-3], 'numberplate': lambda p: p[-4], 'timestamp': lambda p: p[-5] } ), # 对应原普通len==5的分支 ( lambda p, i: len(p) == 5, { 'country': lambda p: p[-2], 'camera': lambda p: p[-5], 'numberplate': lambda p: p[-3], 'timestamp': lambda p: p[-4] } ), # 对应原len==4的分支 ( lambda p, i: len(p) == 4, { 'camera': lambda p: p[-4], 'numberplate': lambda p: p[-2], 'timestamp': lambda p: p[-3] } ) ] # 遍历规则匹配 matched = False for condition, field_map in rules: if condition(parts, img): for field, get_val in field_map.items(): locals()[field] = get_val(parts) matched = True break # 无匹配时打印文件名,和原逻辑一致 if not matched: print(img) # 返回顺序和原代码完全一致 return (camera, timestamp, numberplate, lane, vehicletype, country, ADRnumber)
方案优势
- 完全兼容原有逻辑,输出结果和原代码无差异
- 后续新增文件名格式只需在规则表中新增条目即可,无需修改主逻辑
- 所有格式规则集中管理,可读性和可维护性大幅提升
- 消除了多层嵌套的分支判断,代码结构更清晰
内容的提问来源于stack exchange,提问作者Rudra vrishaba
相关产品推荐
相关产品推荐

