Python条件语句调试:实现目标分支轮询,离线时禁止发往主分支
代码修改方案
问题根因
- 原代码仅在执行之初调用1次
get_address_data()获取分支列表,后续等待10秒的逻辑没有刷新地址数据,永远无法识别新上线的分支 - 末尾的兜底判断逻辑优先级过高:只要当前拉取的分支列表中不存在指定的目标分支,不管用户有没有指定要发往该分支,都会直接返回主分支地址,完全没有等待分支上线的机制
- 你之前写的尝试代码存在语法和逻辑错误:遍历的
branch_name是存邮编和发货项的元组列表,不是原分支字典结构,直接取c["company"]会直接抛出类型错误
修改思路
- 优先判断用户是否指定了目标分支,如果未指定才直接走主分支兜底逻辑
- 给分支查找逻辑加外层死循环,每次循环都重新拉取最新的分支地址数据,保证能获取到刚上线的分支信息
- 每次循环找不到目标分支就休眠10秒,再进入下一次循环重新查找,直到匹配到目标分支为止
完整修改后代码
import time # 先判断是否未指定分支,未指定直接走主分支 target_branch = self.get_option("branch") if not target_branch: address_data = self.get_address_data() return self.item_address(address_data["main_branch"]["item_purchase"]["warehouse"]) # 指定了分支就进入轮询逻辑,直到找到目标分支为止 while True: # 每次轮询都重新拉取最新的地址数据,保证能拿到新上线的分支 address_data = self.get_address_data() branchAddress = address_data.get("branch") log.trace("{0!r}".format(address_data)) if branchAddress: # 生成当前可用的分支列表 available_postcodes = [] branch_name = [] for b in branchAddress: postcode = b["company"]["postal_code"] available_postcodes.append(postcode) branch_name.append((postcode, b["company"]["shipment_item"])) log.info("Available addresses: {0}".format(", ".join( ["{0} ({1})".format(k, v) for k, v in branch_name]))) # 检查目标分支是否在当前可用列表中 if target_branch in available_postcodes: # 找到目标分支,返回对应地址 for b in branchAddress: if b["company"]["postal_code"] == target_branch: item_purchase = b.get("item_purchase") if item_purchase: return self.item_address(item_purchase["warehouse"]) # 没找到就等10秒再轮询 log.info(f"目标分支 {target_branch} 未找到,10秒后重新搜索") time.sleep(10)
逻辑说明
- 移除了原代码中分支不存在就直接返回主分支的逻辑,只要用户指定了目标分支就会一直轮询
- 每次轮询都会重新拉取全量地址数据,能实时识别新上线的分支
- 只有用户未主动指定目标分支的场景下,才会直接返回主分支地址,符合需求
内容的提问来源于stack exchange,提问作者Mythorim
相关产品推荐
相关产品推荐

