Python TypeError - индексы списка должны быть целыми или кусочками, а не str - PullRequest
0 голосов
/ 29 января 2020

У меня есть лямбда-функция, которая предназначена для включения / выключения лампочек Philip HUE. Я могу выполнить скрипт python, и он работает (без ошибок) на моей локальной машине. Однако, когда я запускаю функцию Lambda (используя кнопку IoT), я получаю следующее сообщение об ошибке:

[ERROR] TypeError: list indices must be integers or slices, not str
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 13, in lambda_handler
    if data["state"]["on"] == False:

У кого-нибудь есть идеи / идеи? Вот полный Python скрипт:

import requests,json

bridgeIP = "ip_here"
userID = "userID_here"
lightID = "4" #Represents the ID assigned to lightbulb, in the living room.

def lambda_handler(lightID, lambda_context):
    url = f"http://{bridgeIP}/api/{userID}/lights/{lightID}"

    r = requests.get(url)
    data = json.loads(r.text)

    if data["state"]["on"] == False:
        r = requests.put(f"{url}/state", json.dumps({"on":True}))
    elif data["state"]["on"] == True:
        r = requests.put(f"{url}/state", json.dumps({"on":False}))

lambda_handler(lightID, 4)

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

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Переменная dataString представляет собой словарь (НЕ список) значений. Мне было необходимо использовать функцию nestedGet () , чтобы определить значение клавиши «on».

{"on":True} vs {"on":False})

Окончательную версию моего полнофункционального сценария python можно найти здесь .

0 голосов
/ 29 января 2020

Я бы согласился с @Grismar. Перехватите ошибку:

try:
    if data["state"]["on"] == False:
        r = requests.put(f"{url}/state", json.dumps({"on":True}))
    elif data["state"]["on"] == True:
        r = requests.put(f"{url}/state", json.dumps({"on":False}))
except TypeError:
    dataString = str(Data).strip('[]')
    if dataString["state"]["on"] == False:
        r = requests.put(f"{url}/state", json.dumps({"on":True}))
    elif dataString["state"]["on"] == True:
        r = requests.put(f"{url}/state", json.dumps({"on":False}))

или вы можете сначала проверить data:

if isinstance(data,str) == False
    dataString = str(data).strip('[]')
else:
    dataString = data

if dataString["state"]["on"] == False:
    r = requests.put(f"{url}/state", json.dumps({"on":True}))
elif dataString["state"]["on"] == True:
    r = requests.put(f"{url}/state", json.dumps({"on":False}))
...