Возможно, я немного педантичен, но я бы сказал, что лучший ответ -
if my_var is not None and 'something' in my_var:
#do something
Разница заключается в явной проверке None
, а не в неявном преобразовании my_var
в True
или False
.
Хотя я уверен, что в вашем случае различие не важно, в более общем случае вполне возможно, что переменная не будет None
, но все равно будет иметь значение False
, например целочисленное значение 0
или пустой список.
Так что вопреки большинству утверждений других авторов, что это безопасно, я бы сказал, что это безопасно, если вы явны. Если вы не уверены, рассмотрите этот очень надуманный класс:
class Contrived(object):
def __contains__(self, s):
return True
def __nonzero__(self):
return False
my_var = Contrived()
if 'something' in my_var:
print "Yes the condition is true"
if my_var and 'something' in my_var:
print "But this statement won't get reached."
if my_var is not None and 'something' in my_var:
print "Whereas this one will."
Да, я знаю, что это нереальный пример, но в реальном коде бывают изменения, особенно когда None
используется для указания аргумента функции по умолчанию.