Python操作Azure SDK时如何高效检测嵌套对象中指定重写规则
Azure SDK 重写规则存在性检测优化方案
原有代码的问题
你当前的嵌套循环逻辑核心是对的,但存在几处可优化的点:
- 存在冗余代码:内层循环的
else: continue是无意义写法,循环默认就会进入下一轮迭代,不需要额外声明。 - 边界逻辑有漏洞:如果遍历完所有规则集都没找到名为
Joomla-Rule-Set的目标规则集,函数会隐式返回None,而不是明确的False,在严格判断布尔值的场景下会出现不符合预期的结果。 - 嵌套层级偏深,可读性一般。
优化方案
推荐使用Python内置的any()函数配合生成器表达式实现,这种写法是短路执行的:找到第一个匹配项就立刻终止遍历,执行效率和你手写提前return的循环完全一致,没有额外性能损耗,同时代码更简洁,逻辑更清晰。
可复用的通用实现
把规则集名称、目标规则名称、应用网关对象都抽为参数,方便不同场景调用:
def is_rewrite_rule_present(app_gw, target_rule_set_name: str, target_rule_name: str) -> bool: for rule_set in app_gw.rewrite_rule_sets: # 匹配目标规则集,getattr加默认值避免属性缺失时报错 if getattr(rule_set, "name", None) == target_rule_set_name: # 检查规则集内是否存在目标规则,找到即返回 return any( getattr(rule, "name", None) == target_rule_name for rule in rule_set.rewrite_rules ) # 未找到目标规则集,直接返回False return False
对应你原有场景的调用方式:
rule_exists = is_rewrite_rule_present(application_gateway, "Joomla-Rule-Set", "MaintenanceRewrite")
极简写法(无需复用时可选)
如果不需要复用函数,只是单次判断,也可以用双层生成器写得更简短:
def is_present(): return any( rule.name == "MaintenanceRewrite" for rule_set in application_gateway.rewrite_rule_sets if rule_set.name == "Joomla-Rule-Set" for rule in rule_set.rewrite_rules )
注意:这种写法会遍历所有名称匹配的规则集做检查,如果你确认规则集名称全局唯一,和你原有逻辑的执行结果完全一致;如果存在重名规则集,会检查所有重名规则集内的规则,只要有一个匹配就返回True。
补充说明
- 如果你确定Azure SDK返回的模型对象一定存在
name属性,可以把getattr(xxx, "name", None)直接替换为xxx.name,写法更简洁,性能没有明显差异。 - 不要用列表推导式配合
any(),列表推导式会一次性遍历完所有规则生成完整列表,会损失短路执行的性能优势,用生成器表达式才是最优选择。
内容的提问来源于stack exchange,提问作者jsjw
相关产品推荐
相关产品推荐

