如何在可为None的字符串变量中检查子串是否存在?
处理可能为None的字符串子串查找问题
当变量brand可能为None或字符串时,除了先判断brand is not None再执行子串查找的嵌套写法,还有几种更简洁的实现方式:
方法1:用空字符串兜底(or操作符)
利用Python的逻辑短路特性,当brand为None时,用空字符串替代,这样in操作不会触发异常,且空字符串中必然找不到目标子串,结果符合预期。
# brand为None的情况 brand = None if "Vans" in (brand or ""): print("Y") else: print("N") # 输出 - N # brand为字符串的情况 brand = "Vans.com" if "Vans" in (brand or ""): print("Y") else: print("N") # 输出 - Y
方法2:三元表达式显式处理
用三元表达式明确处理None的情况,可读性更强,逻辑清晰。
# brand为None的情况 brand = None target = "Vans" if target in (brand if brand is not None else ""): print("Y") else: print("N") # 输出 - N # brand为字符串的情况 brand = "Vans.com" if target in (brand if brand is not None else ""): print("Y") else: print("N") # 输出 - Y
方法3:利用getattr(偏技巧性)
通过getattr获取对象的__contains__方法(in操作本质调用的就是这个方法),如果brand是None,则返回一个永远返回False的lambda函数,避免异常。不过这种写法可读性稍弱,日常场景更推荐前两种。
# brand为None的情况 brand = None if "Vans" in getattr(brand, '__contains__', lambda x: False)(): print("Y") else: print("N") # 输出 - N # brand为字符串的情况 brand = "Vans.com" if "Vans" in getattr(brand, '__contains__', lambda x: False)(): print("Y") else: print("N") # 输出 - Y
这些方法的优势在于避免了嵌套的if判断,代码更紧凑简洁,同时保持逻辑的清晰性。
内容的提问来源于stack exchange,提问作者M J
相关产品推荐
相关产品推荐

