我正在创建我的(第一个(Lambda函数。Lambda设计用于打开/关闭飞利浦HUE灯泡。Lambda 函数的触发器是 AWS IoT (Dash( 按钮。
但是,在触发我的 Lambda 函数后,我收到以下错误消息:
[ERROR] TypeError: lambda_handler() takes 1 positional argument but 2 were given
Traceback (most recent call last):
File "/var/runtime/bootstrap.py", line 131, in handle_event_request
response = request_handler(event, lambda_context)
任何人都可以提供任何关于我的Python代码问题的见解吗?谢谢!
import requests,json
bridgeIP = "PublicIPAddress:999"
userID = "someone"
lightID = "2"
def lambda_handler(lightID):
url = "http://"+bridgeIP+"/api/"+userID+"/lights/"+lightID
r = requests.get(url)
data = json.loads(r.text)
if data["state"]["on"] == False:
r = requests.put(url+"/state",json.dumps({'on':True}))
elif data["state"]["on"] == True:
r = requests.put(url+"/state",json.dumps({'on':False}))
lambda_handler(lightID)
您的处理程序函数应定义为:
def lambda_handler(event, context):
lightID = event
...
来自 Python 中的 AWS Lambda Function Handler - AWS Lambda:
event
– AWS Lambda 使用此参数将事件数据传递给处理程序。此参数通常是 Python 字典类型。它也可以是列表、str、int、float 或 NoneType 类型。调用函数时,将确定事件的内容和结构。当 AWS 服务调用您的函数时,事件结构因服务而异。
context
– AWS Lambda 使用此参数向您的处理程序提供运行时信息。
您的event
很可能只包含代码所示的轻 ID,但最好event
调用它,以识别它是传递给 Lambda 函数的值,但您的代码随后选择将其解释为lightID
。
此外,代码不应调用lambda_handler
函数。AWS Lambda 服务将在调用函数时执行此操作。
最后,你可能想利用Python 3.x f-strings,它可以制作更漂亮的字符串格式:
import requests
import json
bridgeIP = "PublicIPAddress:999"
userID = "someone"
def lambda_handler(event, context):
lightID = event
url = f"http://{bridgeIP}/api/{userID}/lights/{lightID}"
r = requests.get(url)
data = json.loads(r.text)
r = requests.put(f"{url}/state", json.dumps({'on': not data["state"]["on"]}))
错误消息告诉您lambda_handler
函数提供了两个位置参数,但该函数被定义为仅接受一个。
Lambda 会自动为处理程序函数提供两个参数,因此您需要将函数定义为接受两个参数。
您可以通过将函数定义更改为:
def lambda_handler(lightID, lambda_context):