Сравнение значений кортежа - PullRequest
0 голосов
/ 01 ноября 2018

Я довольно новичок в Python / Flask и пишу небольшой скрипт для домашней автоматизации, с которой я играю.

На данный момент в моем скрипте есть маршрут, который запускается заданием cron. Это нюхает пакеты Bluetooth, чтобы увидеть, кто в доме, а кто нет в доме, чтобы я мог контролировать отопление. В моей таблице есть строка для каждого человека и статус «В» или «Вне».

Это отлично работает.

У меня есть другой маршрут, чтобы прочитать значения обратно и отобразить зеленую или красную полосу на моей приборной панели в зависимости от того, включены они или нет.

Это чтение значений и логика, с которой у меня проблемы.

Если я получаю статус человека и отображаю его на своей панели (созданной с помощью шаблона HTML), отображается значение:

( 'В')

В таблице MySQL это просто In - без кавычек или скобок.

В моем скрипте Python у меня есть:

conn = MySQLdb.connect(host="localhost", user = "*****", passwd = "*****", db = "mydb")
                cursor = conn.cursor()
                cursor.execute("select status from occupants WHERE id = '1'")
                data = cursor.fetchone()
                result = data
                #result = str(result)
                if (result == "In"):
                   result = "In"
                else:
                  result = "Out"

Это всегда возвращает Out.

Я пробовал разные вещи в своем утверждении if, но, очевидно, не нашел правильного. Я даже попробовал:

if (result == "('In',)")

Но даже это возвращает Out.

Начинаю рвать на себе волосы сейчас, так как я искал и играл около двух дней именно на этом.

Любые идеи с благодарностью приняты!

Ответы [ 5 ]

0 голосов
/ 01 ноября 2018

Согласен с Абхиджитом; индексация была бы лучшей идеей.

Вероятно, результат запроса вашей базы данных должен выглядеть следующим образом:

database_query_result = [('In',)]

Если это так, вы можете просто получить статус жильцов, как показано ниже, чтобы получить желаемый ответ без логического сравнения.

result = database_query_result[0][0]
print(result)

Почему это работает:

  • database_query_result [0] дает вам кортеж -> ('In',)
  • database_query_result [0] [0] возвращает значение кортежа. -> «В»
0 голосов
/ 01 ноября 2018

У вас есть больше данных в «результате», чем просто «В». Например:

a = ["yes", "hello"]
b = "no"

if "yes" == a:
    print("yes yes yes")
else:
    print("Something is wrong")

Это дает вам "Что-то не так" в качестве вывода, но если вы делаете:

a = ["yes", "hello"]
b = "no"

if "yes" in a:
    print("yes yes yes")
else:
    print("Something is wrong")

Теперь вы получаете «да, да, да» в качестве вывода. Надеюсь, это поможет немного:)

0 голосов
/ 01 ноября 2018

Вам необходимо получить значение по индексу. Python возвращает кортежи для строк. Вам нужно получить первый столбец.

Просто получите значение по индексу, данным [0]

Тогда вы продолжите сравнение.

Редактировать: когда вы используете операторы "in", вы просто просматриваете кортеж.

Это работает, но не очень хорошая идея, когда вы уже точно знаете, данные, которые вы ищете, имеют индекс 0.

0 голосов
/ 01 ноября 2018

Вы используете cursor.fetchone(), который возвращает tuple или None (если элемент не найден). Таким образом, после выполнения команды вы получаете кортеж с одним элементом, который имеет меньший смысл в этом контексте, но именно так этот API-интерфейс Python возвращает данные. Таким образом, даже после использования fetchone() вам необходимо явно получить доступ к первому элементу, что можно сделать как lst[0]. Поэтому вам нужно изменить строку следующим образом:

result = ""
if data is not None: 
    result = data[0]
print result
0 голосов
/ 01 ноября 2018

Ладно, как всегда, через 5 минут после публикации я пробую что-то другое и работаю. Тем не менее, я не уверен, если это выдумка или это правильно:

if 'In' in result:

Теперь это работает.

Для целей этого упражнения не имеет значения, является ли это грязным рабочим местом, но я хотел бы знать, есть ли более элегантное / обычное решение только для моего обучения.

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