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

Python读取含数组值的字典 匹配YAML配置实现条件跳过逻辑

实现方法

原代码存在两处可直接优化的问题:

  • 把YAML文件读取放在版本循环内部,每遍历一个版本就会重复读取一次磁盘文件,产生无意义IO开销,只需在循环外读取一次配置即可。
  • 把结果追加逻辑写在遍历排除规则的循环内,会导致同一个版本重复追加多次结果,且对需要跳过的版本也会发起接口请求,浪费接口资源。

核心判断逻辑非常简单:YAML解析后得到的version字段是Python原生列表类型,直接用in关键字就能判断目标版本是否在排除列表中,不需要额外做数组解析。遍历排除规则时,只要找到「名称和当前水果名一致、且当前版本在对应排除版本列表中」的规则,就标记当前版本需要跳过,终止规则遍历即可。

修正后的完整代码如下:

import yaml

def read_yaml(file_path: str):
    with open(file_path, 'r', encoding='utf-8') as f:
        return yaml.safe_load(f)

def do_something(fruit_name: str, data: dict):
    result = []
    versions = [2,3,5,6,7,8]
    # 提前读取一次排除配置
    config = read_yaml("test.yaml")
    exclude_rules = config.get('exclude', [])

    for version in versions:
        need_skip = False
        # 遍历排除规则匹配当前水果+版本
        for rule in exclude_rules:
            if rule.get('name') == fruit_name and version in rule.get('version', []):
                need_skip = True
                break
        
        if need_skip:
            continue
        
        # 不需要跳过的版本才发起请求、追加结果
        url = f"some.api.url/subjects/{fruit_name}/versions/{version}"
        response = sr_rest_api.session.post(url, json=data).json()
        result.append(response["is_fruit"])

    return result

逻辑验证

以给出的配置为例:

  • 传入fruit_name="apple"时,只有版本3命中排除规则,会正常处理2、5、6、7、8五个版本
  • 传入fruit_name="pear"时,版本2、4、5命中排除规则,会正常处理3、6、7、8四个版本
  • 传入其他水果名时,所有版本都不会命中排除规则,会全部正常处理

代码里用dict.get()做了容错,即使YAML里缺了exclude字段、或者某条规则缺了version字段,也不会抛出KeyError异常。


内容的提问来源于stack exchange,提问作者user6308605

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:15:43