如何编写带超时的脚本验证指定品牌是否处于Active状态
优化API流式JSON的品牌状态检查脚本(明确标志逻辑)
需求与问题背景
需编写脚本检查API微服务流式输出的JSON数据中,
my_list内的所有笔记本品牌需在10分钟内处于Active状态;若任一品牌未处于该状态(或未在返回数据中找到),脚本执行失败。状态可选值:Active、Booted、Disabled、Purged,my_list可包含任意数量条目。
现有困惑:不确定用单标志还是多标志实现状态检查逻辑,现有代码存在逻辑漏洞。
现有代码的核心问题
- 单标志逻辑错误:
all_brand_status只要检测到一个目标品牌为Active就设为True,忽略其他目标品牌的状态,无法确保所有品牌都符合要求 - 未处理品牌缺失情况:若
my_list中的品牌不在返回的JSON数据里,脚本不会报错,直接忽略 - 缩进语法错误:
else块的缩进不符合Python规范 - 无明确错误提示:无法直观看到哪个品牌不符合状态要求
优化方案:使用集合跟踪状态(替代单/多标志)
推荐用目标品牌集合来跟踪每个品牌的状态,相比单标志更准确,相比多标志(如字典存每个品牌的状态)更简洁高效。核心逻辑:
- 将
my_list转为小写集合,避免大小写匹配问题 - 遍历返回的品牌数据,收集所有符合
Active状态的目标品牌 - 对比目标集合与已确认集合,若完全相等则所有品牌符合要求,否则输出未达标品牌
完整优化代码
import sys from datetime import datetime, timedelta # 存储需要检查的笔记本品牌(小写统一匹配) my_list = ["apple", "hp"] target_brands = set(my_list) def validate_status(): # 从微服务获取流式JSON输出 Sales = func_streaming_logs_json(args) # 假设func_streaming_logs_json已实现 active_target_brands = set() for brand in Sales.get('Brand', []): brand_name = brand.get('name', '').lower() brand_state = brand.get('state', '') if brand_name in target_brands: if brand_state == "Active": active_target_brands.add(brand_name) else: print(f"品牌 {brand_name} 当前状态: {brand_state} (非Active)") # 检查是否所有目标品牌都处于Active状态 missing_brands = target_brands - active_target_brands if missing_brands: print(f"未达标品牌: {', '.join(missing_brands)}") return False return True def time_out_check(timeout_minutes=10): start_time = datetime.now() stop_time = start_time + timedelta(minutes=timeout_minutes) while True: if validate_status(): print("所有目标品牌均处于Active状态,脚本执行成功") break current_time = datetime.now() if current_time > stop_time: print(f"超时:{timeout_minutes}分钟内未满足所有品牌Active要求") sys.exit(1) if __name__ == '__main__': time_out_check()
标志方案说明
- 为什么不用单标志:单标志无法区分「部分品牌达标」和「全部品牌达标」,只要有一个品牌符合就会返回True,完全不符合需求
- 为什么用集合(而非多标志字典):
- 集合的相等性判断可以直接确认所有目标品牌是否都达标,代码简洁
- 可以快速计算未达标的品牌(差集操作),便于排查问题
- 时间复杂度低,查找和添加操作都是O(1),适合任意数量的目标品牌
- 边界处理:
- 处理返回数据中无
Brand字段的情况(用get('Brand', [])避免KeyError) - 处理品牌名称为空的情况(用
get('name', '')) - 统一转为小写,避免大小写匹配错误(如Apple和apple)
- 处理返回数据中无
内容的提问来源于stack exchange,提问作者voltas
相关产品推荐
相关产品推荐

