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

Python如何去除图片文件名解析逻辑中的冗余if-elif-else分支?

优化方案:通过规则配置表消除冗余分支

核心思路是把不同文件名格式的取值逻辑抽象为可配置的规则集合,程序仅需遍历规则匹配当前场景即可,无需编写大量if-elif分支,同时100%保留原有功能。

优化思路说明

  1. 先把所有字段初始化为默认值unknown,避免每个分支重复赋值相同默认值
  2. 把原有每个分支的「匹配条件」和「字段取值规则」统一存入规则表
  3. 遍历规则表找到第一个匹配的规则,按规则为对应字段赋值
  4. 无匹配规则时保留原有的打印文件名逻辑

优化后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:18:04