在Python中为嵌套字典进行换行代码

4
使用 Alexa 中的新实体解析,嵌套字典变得非常嵌套。最符合 Python 风格的方式是什么,如何在每行不超过 79 个字符的情况下编写代码?
这是我目前拥有的东西,虽然它可以工作,但我相信还有更好的方法:
if 'VolumeQuantity' in intent['slots']:
    if 'resolutions' in intent['slots']['VolumeQuantity']:
        half_decibels = intent['slots']['VolumeQuantity']['resolutions']['resolutionsPerAuthority'][0]['values'][0]['value']['name'].strip()
    elif 'value' in intent['slots']['VolumeQuantity']:
        half_decibels = intent['slots']['VolumeQuantity']['value'].strip()

以下是从Alexa获取的JSON数据的部分样例:
  {
    "type": "IntentRequest",
    "requestId": "amzn1.echo-api.request.9a...11",
    "timestamp": "2018-03-28T20:37:21Z",
    "locale": "en-US",
    "intent": {
      "name": "RelativeVolumeIntent",
      "confirmationStatus": "NONE",
      "slots": {
        "VolumeQuantity": {
          "name": "VolumeQuantity",
          "confirmationStatus": "NONE"
        },
        "VolumeDirection": {
          "name": "VolumeDirection",
          "value": "softer",
          "resolutions": {
            "resolutionsPerAuthority": [
              {
                "authority": "amzn1.er-authority.echo-blah-blah-blah",
                "status": {
                  "code": "ER_SUCCESS_MATCH"
                },
                "values": [
                  {
                    "value": {
                      "name": "down",
                      "id": "down"
                    }
                  }
                ]
              }
            ]
          },
          "confirmationStatus": "NONE"
        }
      }
    },
    "dialogState": "STARTED"
  }

1
它不是非常漂亮,但你可以将其分成多行,使索引形成一列(换句话说,视觉上堆叠它们)。 - Cory Kramer
2
您可以将先前访问的嵌套字典的中间值存储在单独/有意义的变量中。 - Moinuddin Quadri
可能是Python中列表、字典等的最佳格式规范的重复内容。 - chickity china chinese chicken
davedwards - 我更新了我的问题,因为我应该说的是嵌套字典。我认为你链接的可能重复是针对大型列表,而不是过度嵌套(基于我最初错误措辞的问题,重复将适用)。 - Eric D'Souza
2个回答

6
您可能是在提到嵌套字典,因为列表只接受整数索引。
无论如何,通过圆括号内的隐式换行,我认为这段代码非常易读:
>>> d = {'a':{'b':{'c':'value'}}}
>>> (d
...     ['a']
...     ['b']
...     ['c']
... )
'value'

或者可选择

>>> (d['a']
...   ['b']
...   ['c'])
'value'

1
你说得对,我指的是嵌套字典而不是列表。我已经更新了我的问题,并添加了我正在尝试读取的示例JSON。我不知道括号内隐含的行连续性,这解决了我的问题! - Eric D'Souza

0

首先,您可以使用一些命名良好的中间变量,使程序更易读、更简单和更快:

volumes = intent['slots']  # Pick meaningful names. I'm just guessing.
if 'VolumeQuantity' in volumes:
    quantity = volumes['VolumeQuantity']
    if 'resolutions' in quantity:
        half_decibels = quantity['resolutions']['resolutionsPerAuthority'][0]['values'][0]['value']['name'].strip()
    elif 'value' in quantity:
        half_decibels = quantity['value'].strip()

其次,您可以编写一个名为nav(structure, path)辅助函数来浏览这些结构,例如:
nav(quantity, 'resolutions.resolutionsPerAuthority.0.values.0.value.name')

将给定的路径拆分并执行索引/查找操作序列。它可以使用 dict.get(key, default),这样您就不必进行太多的 if key in dict 检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接