猿问

AWS Lambda 错误:AttributeError 'list' 对象没有属性 'get'

我有一个 Lambda 函数,旨在打开/关闭我的 Philip HUE 灯泡。我能够执行 python 脚本并在我的本地机器上运行(无错误)。但是,当我触发 Lambda 函数(使用 IoT 按钮)时,我收到以下错误消息。


[ERROR] AttributeError: 'list' object has no attribute 'get'

Traceback (most recent call last):

  File "/var/task/lambda_function.py", line 21, in lambda_handler

    bulbStatus = nested_get(data,["state","on"])

  File "/var/task/lambda_function.py", line 16, in nestedDictLookup

    internal_dict_value = internal_dict_value.get(k, None)

我认为该错误与以下代码行有关:


internal_dict_value = internal_dict_value.get(k, None)

但是,我几乎可以肯定“internal_dict_value”变量是字典,而不是列表。为了验证,我将以下代码行插入到我的脚本中:


internal_dict_value = input_dict

print (internal_dict_value)

这是我收到的输出:


{

    "state": {

        "on": true,

        "bri": 254,

        "hue": 8597,

        "sat": 121,

        "effect": "none",

        "xy": [

            0.4452,

            0.4068

        ],

        "ct": 343,

        "alert": "select",

        "colormode": "xy",

        "mode": "homeautomation",

        "reachable": false

    },

    "swupdate": {

        "state": "noupdates",

        "lastinstall": "2019-07-26T19:09:58"

    },

    "type": "Extended color light",

    "name": "Couch Light",

    "modelid": "LCT016",

    "manufacturername": "Philips",

    "productname": "Hue color lamp",

    "capabilities": {

        "certified": true,

        "control": {

            "mindimlevel": 1000,

            "maxlumen": 800,

            "colorgamuttype": "C",

            "colorgamut": [

                [

                    0.6915,

                    0.3083

                ],

                [

                    0.1700,

                    0.7000

                ],

                [

                    0.1532,

                    0.0475

                ]

            ],

            "ct": {

                "min": 153,

                "max": 500

            }

        },

        "streaming": {

            "renderer": true,

            "proxy": true

        }

    },


我脚本的最后一行调用了 lambda_handler() 函数。我被告知我不需要此行,因为我的 Lambda 在触发 Lambda 函数时调用该函数。但是我(相信)在我的本地机器上执行脚本时,我确实需要手动调用该函数。


Helenr
浏览 138回答 2
2回答

繁花如伊

在循环期间更改 internal_dict_value 的值的问题是您不知道它将保存什么类型。尝试类似的东西if type(internal_dict_value) is dict:

达令说

这是我的(全功能)python 脚本的最终版本。import requests,jsonbridgeIP = "IP/FQDN_Here:port_here"userID = "userHash_here"lightID = "2"def lambda_handler(event, lambda_context):    url = f"http://{bridgeIP}/api/{userID}/lights/{lightID}"    r = requests.get(url)    data = json.loads(r.text)    def nested_get(input_dict, nested_key):        internal_dict_value = input_dict        for k in nested_key:            if type(internal_dict_value) is dict:                internal_dict_value = internal_dict_value.get(k, None)                if internal_dict_value is None:                    return None        return internal_dict_value    bulbStatus = nested_get(data,["state","on"])    if bulbStatus == False:        requests.put(f"{url}/state",json.dumps({"on":True}))    elif bulbStatus == True:        requests.put(f"{url}/state",json.dumps({"on":False}))    return {        'statusCode': 200,        'body': json.dumps('Mission accomplished!')    }
随时随地看视频慕课网APP

相关分类

Java
我要回答