Должен ли я сравнить с None явно - PullRequest
3 голосов
/ 23 января 2020

У меня есть относительно простой 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:

I Я не уверен, какая версия больше Pythoni c: неявная или явная проверка? Кроме того, если я использую любой другой тип (кроме коллекций, которые при оценке в тесте логического контекста на пустоту) я должен сравнить с None явно?

1 Ответ

4 голосов
/ 23 января 2020

Это зависит от значений, которые может принимать ваша переменная, и от ожиданий вашего кода. Если ваша переменная может принимать другие значения falsey , тогда да, разница между None и, скажем, [] может быть значительной, и вам необходимо явно проверить is None.

но не всегда. Что если ваше значение равно falsey [], а вы пишете if foo:, чтобы решить, есть ли у вас значение, требующее обработки? Ну, пустой список тоже может не нуждаться в обработке, так как он пустой. Таким образом, None и [] могут рассматриваться одинаково. В этом случае вам нужно явно проверить is None и и пустой список, и в этом случае if foo: уже очень кратко инкапсулирует оба.

В вашем случае, если переменная может быть None или Thread, нет разницы, добавите ли вы is not None или нет, в обоих случаях он будет вести себя одинаково. Так зачем делать его более многословным, чем нужно?

Нет единого правила, подходящего для всех ситуаций.

...