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
相关产品推荐
相关产品推荐

