Python如何实现None安全的len及in(子串匹配)操作?
Python None安全的len/in操作简洁实现方案
最简写法(兼容所有Python3版本)
利用Python原生的布尔真值规则和短路求值特性,你原有的判断逻辑可以直接简化为:
if agreements and agreements[0].action_taken and 'system' in agreements[0].action_taken: # 业务逻辑
简化原理
- Python布尔上下文中,
None、空列表、空字符串、空字典等对象都会被判定为False,因此不需要显式写agreements != None和len(agreements) > 0,直接写if agreements即可覆盖这两个判断 - 逻辑与
and是短路求值的,前面的条件不满足时不会执行后面的判断:如果agreements为空/None,就不会执行取agreements[0]的操作;如果action_taken为None/空,也不会执行'system' in xxx的判断,完全不会出现空指针报错
优化小提示
Python规范中判断是否为None统一用is not None而非!= None,可以避免自定义对象重写__eq__方法导致的异常判断。
3.10+ 进阶写法(结构模式匹配)
如果你的运行环境支持Python 3.10及以上版本,可以用结构模式匹配写得更清晰,适配边界场景的扩展性也更强:
match agreements: # 匹配非空列表,且第一个元素的action_taken为字符串类型,包含system子串 case [item, *rest] if hasattr(item, 'action_taken') \ and isinstance(item.action_taken, str) \ and 'system' in item.action_taken: # 业务逻辑
通用工具封装
如果你需要频繁做None安全的包含判断、长度判断,可以封装通用工具函数复用:
def safe_contains(content: any, substring: str) -> bool: return isinstance(content, str) and substring in content def safe_len(obj: any) -> int: return len(obj) if obj is not None else 0
使用示例:
if safe_len(agreements) > 0 and safe_contains(agreements[0].action_taken, 'system'): # 业务逻辑
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

