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

如何编写带超时的脚本验证指定品牌是否处于Active状态

优化API流式JSON的品牌状态检查脚本(明确标志逻辑)

需求与问题背景

需编写脚本检查API微服务流式输出的JSON数据中,my_list内的所有笔记本品牌需在10分钟内处于Active状态;若任一品牌未处于该状态(或未在返回数据中找到),脚本执行失败。状态可选值:Active、Booted、Disabled、Purged,my_list可包含任意数量条目。
现有困惑:不确定用单标志还是多标志实现状态检查逻辑,现有代码存在逻辑漏洞。

现有代码的核心问题

  1. 单标志逻辑错误:all_brand_status只要检测到一个目标品牌为Active就设为True,忽略其他目标品牌的状态,无法确保所有品牌都符合要求
  2. 未处理品牌缺失情况:若my_list中的品牌不在返回的JSON数据里,脚本不会报错,直接忽略
  3. 缩进语法错误:else块的缩进不符合Python规范
  4. 无明确错误提示:无法直观看到哪个品牌不符合状态要求

优化方案:使用集合跟踪状态(替代单/多标志)

推荐用目标品牌集合来跟踪每个品牌的状态,相比单标志更准确,相比多标志(如字典存每个品牌的状态)更简洁高效。核心逻辑:

  • 将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()

标志方案说明

  1. 为什么不用单标志:单标志无法区分「部分品牌达标」和「全部品牌达标」,只要有一个品牌符合就会返回True,完全不符合需求
  2. 为什么用集合(而非多标志字典):
    • 集合的相等性判断可以直接确认所有目标品牌是否都达标,代码简洁
    • 可以快速计算未达标的品牌(差集操作),便于排查问题
    • 时间复杂度低,查找和添加操作都是O(1),适合任意数量的目标品牌
  3. 边界处理:
    • 处理返回数据中无Brand字段的情况(用get('Brand', [])避免KeyError)
    • 处理品牌名称为空的情况(用get('name', ''))
    • 统一转为小写,避免大小写匹配错误(如Apple和apple)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:57:07