我有一个相对简单的Python代码:
import threading
class Foo():
def __init__(self):
self._thread = None
def start(self):
self._thread = threading.Thread(...)
def stop(self):
if self._thread:
...
[一位同事建议我应该在None
函数中明确地与stop
作比较:if self._thread is not None:
我不确定哪个版本更适合Pythonic:隐式或显式检查?另外,如果我使用其他任何类型(除了集合,在布尔上下文测试中评估其是否为空时都应该与None
进行显式比较?
这取决于变量可能采用的值以及代码的期望值。如果您的变量可能采用其他falsey值,则可以,None
与[]
之间的差异可能很大,您需要显式检查is None
。
但并非总是如此。如果您的值是falsey []
,并且您正在编写if foo:
来确定您是否有一个需要处理的值怎么办?好吧,一个空列表可能也不需要处理,因为它是空的。因此None
和[]
可以被视为相同。在这种情况下,您需要显式检查is None
and和空列表,在这种情况下,if foo:
已经非常简洁地封装了两者。
没有一个适合所有情况的规则。