2016-11-04 5 views
0

У меня возникли проблемы с вложенным оператором if/else. Оператор else выше частичного соответствия выполняется, даже если оператор if оценивает значение true .. Я не понимаю, почему это произойдет .. Любая помощь будет оценена.Вложенный, если/else, иначе выполняется, когда он не должен?

def search(): 
if request.method == 'GET': 
    return render_template('search_form.html') # TODO ADD THIS TEMPLATE 
elif request.method == 'POST': 
    form = 'Search Form' 
    searchInput = request.form['search'] 
    if len(searchInput) < 3: 
     errStr = 'The search term you entered is to short. Searches must have 4 characters.' 
     msg = [form, errStr] 
     return error(msg) 
    else: 
     exactMatch = Clients.query.filter(or_(Clients.cellNum==searchInput, 
              Clients.homeNum==searchInput, 
              Clients.otherNum==searchInput)).first() 
     print(exactMatch.firstName) 
     print(bool(exactMatch)) 
     if exactMatch is True: 
      clientID = exactMatch.id 
      print(clientID) 
     else: 
      partialSearch = Clients.query.filter(or_(Clients.cellNum.like("%{}%".format(searchInput)), 
             Clients.homeNum.like("%{}%".format(searchInput)), 
             Clients.otherNum.like("%{}%".format(searchInput)), 
             Clients.lastName.like("%{}%".format(searchInput)), 
             Clients.firstName.like("%{}%".format(searchInput)))).all() 
      return render_template('display_search.html', results=partialSearch) 
+3

'is' проверяет подлинность. Он проверяет, совпадают ли оба объекта, и, очевидно, возврат 'filter' не возвращает объект' True'. Вы хотите использовать оператор '==' или в этом случае просто полностью опустите его и просто напишите 'if exactMatch:' –

ответ

4

bool(exactMatch) быть True не означает, что exactMatch строго True.

Объекты в Python могут быть truthy и falsy в логическом контексте, даже если они не являются булевыми.

Например:

bool("") # False 
"" is False # False 
bool("abc") # True 
"abc" is True # False 

Для общих идиом Python вы перескочить проверку личности. Например:

if exactMatch: 
    do_something() 
    # executes if exactMatch is thruthy in boolean context, including: 
    # True, non-empty sequences, non-empty strings and almost all custom user classes 
else: 
    do_other_thing() 
    # executes if exactMatch is falsy in boolean context, including: 
    # False, None, empty sequences etc. 
Смежные вопросы