AWS Lambda [ERROR] Функция принимает 1 позиционный аргумент, но 2 были заданы - PullRequest
1 голос
/ 23 января 2020

Я создаю свою (самую первую) лямбда-функцию. Лямбда предназначена для включения / выключения лампы Philips HUE. Триггером для функции Lambda является кнопка AWS IoT (Da sh).

Однако после запуска функции 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)

Can Кто-нибудь предлагает что-то понять, что не так с моим 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)

Ответы [ 2 ]

1 голос
/ 23 января 2020

В сообщении об ошибке сообщается, что вашей функции lambda_handler дано два позиционных аргумента, но определена функция, принимающая только один.

Lambda автоматически передает два аргумента в функцию-обработчик, поэтому вы необходимо определить вашу функцию для приема двух аргументов.

Вы можете сделать это, изменив определение вашей функции на:

def lambda_handler(lightID, lambda_context):
0 голосов
/ 23 января 2020

Ваша функция обработчика должна быть определена как:

def lambda_handler(event, context):
    lightID = event
    ...

С AWS Лямбда-функция Обработчик в Python - AWS Лямбда :

event - AWS Lambda использует этот параметр для передачи данных события обработчику. Этот параметр обычно имеет тип Python dict. Это также может быть тип list, str, int, float или NoneType.

Когда вы вызываете свою функцию, вы определяете содержание и структуру события. Когда служба AWS вызывает вашу функцию, структура события зависит от службы.

context - AWS Lambda использует этот параметр для предоставления информации о времени выполнения вашему обработчику.

Вполне вероятно, что ваш event просто содержит Light ID, как показано вашим кодом, но лучше всего назвать его event, чтобы распознать, что это значение передается в функцию Lambda, но тогда ваш код выбрав для интерпретации его как lightID.

Кроме того, ваш код не должен вызывать функцию lambda_handler. Служба AWS Lambda сделает это при вызове функции.

Наконец, вы можете воспользоваться Python 3.x f-строками, которые создают строки в более хорошем формате:

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"]}))
...