Подтвердить что ты не робот

Проверьте, установлена ​​ли одна из переменных в None

Недавно мне пришлось реализовать небольшую проверку для любых переменных, которые, возможно, не были инициализированы (а их значение по умолчанию - None). Я придумал это:

if None in (var1, var2, var3):
    error_out()

Хотя, на мой взгляд, граничащей с красивой, мне было интересно - это хороший способ сделать это? Это способ сделать это? Существуют ли случаи, когда это может привести к неожиданным результатам?

4b9b3361

Ответ 1

Прежде всего: ваш код действителен, читабельен, краток... так что это может быть не способ (idioms развивается со временем и новыми языковыми функциями), но это, безусловно, один из способов сделать это с помощью pythonic.

Во-вторых, всего два наблюдения:

Стандартный способ генерации ошибок в python - raise Exceptions. Вы можете, конечно, обернуть свое исключение в рамках функции, но, поскольку это довольно необычно, мне просто интересно, выбрали ли вы этот дизайн по какой-то определенной причине. Поскольку вы можете написать свой собственный класс Exception, даже шаблонный код, например, запись сообщения об ошибке в файл, может проходить внутри самого класса, а не в функции обертки.

Способ написания теста таков, что вы не сможете назначить None как значение для переменных. Это может быть не проблема сейчас, но может ограничить вашу гибкость в будущем. Альтернативный способ проверить инициализацию может состоять в том, чтобы просто не объявить начальное значение для рассматриваемой переменной, а затем сделать что-то по строкам:

try:
    self.variable_name
except NameError:
    # here the code that runs if the variable hasn't been initialised
finally:
    # [optional] here the code that should run in either case

Ответ 2

Просто немного другой способ сделать это - использовать встроенный метод all; однако это также приведет к ложным значениям типа 0 или "", которые могут быть не такими, какие вы хотите:

>>> all([1, 2, 3])
True
>>> all([None, 1, 2])
False
>>> all([0, 1])
False

Ответ 3

Позвольте мне оставить мои два цента здесь:

>>> any(a is None for a in [1,0])
False
>>> any(a is None for a in [1,0, None])
True

Итак, можно:

def checkNone(*args):
    if any(arg is None for arg in args):
        error_out()

Ничего нового здесь. Просто IMHO, возможно, часть any arg is None более читаема