Python, как проверить, существует ли переменная и ее длина, в одном операторе if? - PullRequest
7 голосов
/ 22 сентября 2011

Вот моя ситуация:

if var:
    if len(var) == 5:
        do something...
else:
    do the same thing...

Чтобы не повторять один и тот же фрагмент кода, я хотел бы объединить эти два условия в одно. Но если var - None, я не могу проверить его длину ... Есть идеи? Я хотел бы что-то вроде этого:

if var and len(var) == 5:
    do something...

Ответы [ 3 ]

15 голосов
/ 22 сентября 2011

Вы пробовали это?Это работает:

if var and len(var) == 5:
    ....

Оператор and не оценивает RHS, если LHS ложно.Попробуйте это:

>>> False and 1/0
False
>>> True and 1/0
ZeroDivisionError: division by zero
3 голосов
/ 22 сентября 2011

Код, который вы написали в вопросе, выполняет операторы в двух случаях:

  • var оценивается как true и имеет длину 5
  • var оценивается как ложное (например, None или False)

Вы можете объединить их в одно условие следующим образом:

if not var or len(var) == 5:
    ...

Условно, что некоторые другие ответыЕсли предположить, var and len(var) == 5, то оценивается только True в первом случае, а не во втором.Я скажу, однако, что два случая, которые вы выбрали, являются своего рода необычной комбинацией.Вы уверены, что не намеревались выполнять операторы, только если переменная имеет ненулевое значение и имеет длину 5?

Кроме того, как 6502 написал в комментарии,функции предназначены именно для этого случая, а именно для создания многократно используемых блоков кода.Таким образом, другое простое решение будет

 def f():
     ....
 if var:
     if var.length == 5:
         f()
 else:
     f()
0 голосов
/ 22 сентября 2011

Что ж, исключения кажутся вполне подходящими.

try:
    if len(var) == 5:
        do_something()
except TypeError:
    pass

Вы говорите, что var может быть нулевым, поэтому будет выдано исключение TypeError.Однако, если на самом деле var вообще может не существовать, вы должны поймать исключение NameError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...