首页 > 解决方案 > 我是否应该明确地与 None 进行比较

问题描述

我有一个相对简单的 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明确比较:stopif self._thread is not None:

我不确定哪个版本更 Pythonic:隐式或显式检查?另外,如果我使用任何其他类型(除了集合,在布尔上下文测试中评估空性时)我应该None明确比较吗?

标签: pythonnonetype

解决方案


这取决于您的变量可能采用的值以及您的代码的期望值。如果您的变量可能采用其他虚假None值,那么是的,和之间的差异[]可能很大,您需要明确检查is None.

但不总是。如果您的值是falsey [],并且您正在编写 anif foo:来确定您是否有需要处理的值怎么办?好吧,一个空列表可能也不需要处理,因为它是空的。所以两者None[]都可以被同等对待。在这种情况下,您需要显式检查is None and和空列表,在这种情况下if foo:已经非常简洁地封装了两者。

在您的情况下,如果变量可以是Noneor 或 a Thread,则无论您是否添加都没有区别is not None,它在两种情况下的行为都相同。那么为什么让它比它需要的更冗长呢?

没有一条规则适合所有情况。


推荐阅读