Python: тестирование для None, тестирование для логического значения

Существует ли какая-либо низкоуровневая разница между реализацией (performance-ish) между этими подходами.?

# check if string is empty
# the preferred way it seems [1]
if string:
    print string
else:
    print "It empty."

# versus [2]
if string is '':

# or [3]
if string == '':

Например, при тестировании для None я все еще считаю его более читаемым и явным:

if some_var is not None:

.. вместо..

if not some_var:

if not some_var, по крайней мере для меня, всегда читает "если some_var не существует".

Что лучше использовать, каковы правильные варианты использования для ==, is и bool-testing?

Ответ 1

Никогда не используйте is для тестирования равенства (значения). Используйте его только для проверки идентичности объекта. Он может работать для примера if string is '', но это зависит от реализации, и вы не можете положиться на него.

>>> a = "hi"
>>> a is "hi"
True
>>> a = "hi there!"
>>> a is "hi there!"
False

Кроме этого, используйте все, что лучше всего передает смысл вашего кода.

Я предпочитаю более короткий if string:, но if string != '': может быть более явным.

Затем снова if variable: работает над каждым видом объекта, поэтому, если variable не ограничивается одним типом, это лучше, чем if variable != "" and variable != 0: и т.д.

Ответ 2

Чтобы расширить ответ Тима Пицкера:

if string:
    print string

Это проверяет, имеет ли значение string значение True. То есть.

>>> bool("")
False
>>> bool(None)
False
>>> bool("test")
True

Таким образом, это не только проверка, если оно пустое, но оно None или пустое. Это может повлиять на то, как вы относитесь к None/empty.

Ответ 3

Во-первых, не используйте if string is '':, потому что это не гарантируется. Тот факт, что CPython ставит короткие строки, является деталью реализации и на него нельзя положиться.

Использование if string: для проверки того, что string не является пустым, является, я думаю, способом Pythonic для этого.

Но нет ничего плохого в использовании if string == ''.