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

如何在Python字典的stock值变化时触发对应打印逻辑

问题

我正在开发一个对比函数,需要在调用本地API返回的字典数据发生变化时触发对应打印,具体需求如下:

  • 当stock值从OOS变为LOW或其他非OOS值时,打印补货提示(示例中为"New value has been found!")
  • 当stock从LOW变回OOS时,仅当所有stock均为OOS时才打印"All values are OOS!"

示例数据与预期输出

第一次请求数据

{
  '00194953243062': {
    'value': '00194953243062',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T12:02:06.000Z'
  },
  '00194953243086': {
    'value': '00194953243086',
    'stock': 'OOS',
    'modificationDate': '2022-09-30T10:55:45.000Z'
  },
  '00194953243093': {
    'value': '00194953243093',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T11:05:54.000Z'
  },
  '00194953243130': {
    'value': '00194953243130',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T08:55:48.000Z'
  }
}

预期输出:

All values are OOS!

第二次请求数据

{
  '00194953243062': {
    'value': '00194953243062',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T12:02:06.000Z'
  },
  '00194953243086': {
    'value': '00194953243086',
    'stock': 'OOS',
    'modificationDate': '2022-09-30T10:55:45.000Z'
  },
  '00194953243093': {
    'value': '00194953243093',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T11:05:54.000Z'
  },
  '00194953243130': {
    'value': '00194953243130',
    'stock': 'LOW',
    'modificationDate': '2022-10-22T08:55:48.000Z'
  }
}

预期输出:

New value has been found!

第三次请求数据

{
  '00194953243062': {
    'value': '00194953243062',
    'stock': 'LOW',
    'modificationDate': '2022-10-22T12:02:06.000Z'
  },
  '00194953243086': {
    'value': '00194953243086',
    'stock': 'OOS',
    'modificationDate': '2022-09-30T10:55:45.000Z'
  },
  '00194953243093': {
    'value': '00194953243093',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T11:05:54.000Z'
  },
  '00194953243130': {
    'value': '00194953243130',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T08:55:48.000Z'
  }
}

预期输出:

New value has been found!

第四次请求数据

{
  '00194953243062': {
    'value': '00194953243062',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T12:02:06.000Z'
  },
  '00194953243086': {
    'value': '00194953243086',
    'stock': 'OOS',
    'modificationDate': '2022-09-30T10:55:45.000Z'
  },
  '00194953243093': {
    'value': '00194953243093',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T11:05:54.000Z'
  },
  '00194953243130': {
    'value': '00194953243130',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T08:55:48.000Z'
  }
}

预期输出:

All values are OOS!

当前代码问题

我现在写的代码只检查字典键的变化,无法检测stock值的变更:

previous_data = {}
gtin = # 这里是上述示例中的请求数据

if previous_data.keys() != gtin.keys():
    if all(value['stock'].casefold() == 'oos' for att, value in gtin.items()):
        print("All values are OOS!")

    else:
        print("New value has been found!")

previous_data = gtin

需要实现需求中的stock值变化检测逻辑。

解决方案

要实现需求,需要对比每次请求中每个条目stock值的变化,同时判断全局状态:

完整代码

previous_data = {}

def check_stock_changes(current_data):
    global previous_data
    # 标记是否有符合条件的变化
    trigger_notification = False

    # 首次运行,previous_data为空的情况
    if not previous_data:
        if all(item['stock'].casefold() == 'oos' for item in current_data.values()):
            print("All values are OOS!")
        else:
            print("New value has been found!")
        previous_data = current_data.copy()
        return

    # 遍历当前所有条目,对比stock变化
    for gtin_id, current_item in current_data.items():
        # 处理新增的条目
        if gtin_id not in previous_data:
            if current_item['stock'].casefold() != 'oos':
                trigger_notification = True
            continue
        # 获取前后的stock值(统一小写避免大小写问题)
        prev_stock = previous_data[gtin_id]['stock'].casefold()
        curr_stock = current_item['stock'].casefold()
        # 检测从OOS变为非OOS的情况
        if prev_stock == 'oos' and curr_stock != 'oos':
            trigger_notification = True

    # 检查当前是否所有stock都是OOS
    all_oos_now = all(item['stock'].casefold() == 'oos' for item in current_data.values())
    # 检查之前是否存在非OOS的条目
    had_non_oos_before = any(item['stock'].casefold() != 'oos' for item in previous_data.values())

    # 当前全为OOS且之前有非OOS条目,触发全OOS提示
    if all_oos_now and had_non_oos_before:
        print("All values are OOS!")
    # 有OOS转非OOS的变化,触发补货提示
    elif trigger_notification:
        print("New value has been found!")

    # 更新历史数据
    previous_data = current_data.copy()

逻辑说明

  1. 首次运行处理:当previous_data为空时,直接根据当前数据的全局状态输出对应信息。
  2. 新增条目处理:如果当前数据有新增的GTIN条目,且该条目的stock不是OOS,则标记需要触发补货提示。
  3. stock值变化检测:遍历每个GTIN,对比历史和当前的stock值,只要存在从OOS变为非OOS的情况,就标记需要触发补货提示。
  4. 全OOS状态判断:当当前所有stock都是OOS,且之前存在非OOS的条目时,才打印"All values are OOS!"。
  5. 状态更新:每次处理完当前数据后,将previous_data更新为当前数据的副本,确保下次对比准确。

调用示例

# 传入第一次请求数据
first_request = {
  '00194953243062': {
    'value': '00194953243062',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T12:02:06.000Z'
  },
  '00194953243086': {
    'value': '00194953243086',
    'stock': 'OOS',
    'modificationDate': '2022-09-30T10:55:45.000Z'
  },
  '00194953243093': {
    'value': '00194953243093',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T11:05:54.000Z'
  },
  '00194953243130': {
    'value': '00194953243130',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T08:55:48.000Z'
  }
}
check_stock_changes(first_request)

# 传入第二次请求数据
second_request = {
  '00194953243062': {
    'value': '00194953243062',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T12:02:06.000Z'
  },
  '00194953243086': {
    'value': '00194953243086',
    'stock': 'OOS',
    'modificationDate': '2022-09-30T10:55:45.000Z'
  },
  '00194953243093': {
    'value': '00194953243093',
    'stock': 'OOS',
    'modificationDate': '2022-10-22T11:05:54.000Z'
  },
  '00194953243130': {
    'value': '00194953243130',
    'stock': 'LOW',
    'modificationDate': '2022-10-22T08:55:48.000Z'
  }
}
check_stock_changes(second_request)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:05:35