Python声明字符串真值判断谓词时,替代not not的写法有哪些?
Python字符串Truthy值判断方案
首先先纠正一个常见误区:你列的两种写法 逻辑并不完全等价,这点很容易踩坑:
- 长写法
predicate = some_str_value is not None and len(some_str_value) > 0仅会把None和长度为0的字符串判定为假,如果变量传入的是其他支持len()的falsy值(比如空列表、空字典),这个写法会把这些值判定为假,但如果传入数字、布尔值这类不支持len()的内容会直接抛错。 - 双重否定写法
predicate = not not some_str_value是通过两次取反做隐式布尔转换,所有Python的falsy值(None、0、False、空字符串、空容器等)都会被它判定为假,不止None和空字符串。
针对第一个问题:有没有比not not更简短、符合Python习惯的写法?
有,而且完全符合Python之禅“显式优于隐式”的要求,长度和not not完全一致,就是直接调用内置的布尔类型构造函数做显式转换:
predicate = bool(some_str_value)
这个写法和not not some_str_value的执行逻辑100%一致,没有任何性能差异,但是语义直白没有歧义,任何Python开发者扫一眼就知道你是要获取值对应的布尔判定结果,完全没有双重否定那种别扭的阅读感。
针对第二个问题:如果要严格匹配你最初长写法的逻辑,有没有通用直观的替代方案?
如果你的场景里some_str_value预期是字符串或None,需要严格实现「值不为None、且内容长度大于0」的判断,不要用隐式布尔转换,推荐两种符合直觉的写法:
- 最通用、零歧义的写法(兼容所有支持
len()的类型,不止字符串):predicate = some_str_value is not None and len(some_str_value) > 0注意:这个写法要求传入值必须实现
__len__方法(也就是支持len()调用),如果传入数字、布尔值这类不支持长度计算的类型会直接抛出类型错误,适合明确变量类型的场景使用。
别觉得这个写法啰嗦,它的逻辑完全透明,读代码的人不需要额外回忆Python的隐式转换规则,本身就符合Python“可读性优先”的设计原则。 - 如果你的代码逻辑可以保证
some_str_value要么是None、要么是字符串类型,可以简化成:
因为字符串类型里只有空字符串predicate = some_str_value is not None and some_str_value""是falsy值,这个写法和长写法逻辑完全一致,也没有理解门槛。
补充建议
尽量不要在生产代码里用not not这种取巧写法,它属于依赖运算符副作用的隐式技巧,可读性远不如显式的bool()调用,除了少打两个字符没有任何优势。
内容的提问来源于stack exchange,提问作者Shai Ben-Dor
相关产品推荐
相关产品推荐

