Python TypeError - 列表索引必须是整数或切片,而不是 str
Python TypeError - list indices must be integers or slices, not str
我有一个 Lambda 函数,旨在打开 ON/OFF 我的 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:
有人有 ideas/insight 吗?这是完整的 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() 函数。有人告诉我我不需要这一行,因为我的 Lambda 会在触发 Lambda 函数时调用该函数。但是我(相信)在我的本地机器上执行脚本时我确实需要手动调用该函数。
我不得不同意@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}))
dataString
变量表示值的字典(不是列表)。我有必要使用 nestedGet() 函数来确定 "on" 键的值。
{"on":True} vs {"on":False})
可以找到我的全功能 python 脚本的最终版本 。
我有一个 Lambda 函数,旨在打开 ON/OFF 我的 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:
有人有 ideas/insight 吗?这是完整的 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() 函数。有人告诉我我不需要这一行,因为我的 Lambda 会在触发 Lambda 函数时调用该函数。但是我(相信)在我的本地机器上执行脚本时我确实需要手动调用该函数。
我不得不同意@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}))
dataString
变量表示值的字典(不是列表)。我有必要使用 nestedGet() 函数来确定 "on" 键的值。
{"on":True} vs {"on":False})
可以找到我的全功能 python 脚本的最终版本