在Python中尝试/除外:适合解析词典?

时间:2017-09-18 02:27:58

标签: python python-3.x

我正在尝试解析包含嵌套列表和词典的字典。我正在尝试检测给定的密钥是否存在并将其值保存到适当的变量中。下面的代码有效,但感觉非常混乱。是否有正确/更好的处理方法?

def wit_response(self, message_text=None):
    if message_text is not None:
        resp = self.client.message(message_text)
        print(resp)

        try:
            intent = resp['entities']['intent'][0]['value']
        except:
            intent = None
        try:
            location = resp['entities']['location'][0]['value']
        except:
            location = None
        try:
            datetimefrom = resp['entities']['datetime'][0]['values'][0]['from']['value']
        except:
            datetimefrom = None
        try:
            datetimeto = resp['entities']['datetime'][0]['values'][0]['to']['value']
        except:
            datetimeto = None

resp的示例。

  

{u'entities':{u'intent':[{u'confidence':0.99699357488585,u'value':u'weather'}],u'location':[{u'suggested':是的, u'confidence':0.87101,你''':你''',你''''你喜欢'}}},u'msg_id':u'0jkzwqMkSkpZsKJYx',你'文字':你这是什么天气好像?'}

1 个答案:

答案 0 :(得分:3)

如果不使用某种辅助功能或新容器,您将无法缩短时间。一种方法是编写函数:

def try_get(obj, key):
    if not key:
        return obj

    key, _, rest = key.partition('.')

    try:
        key = int(key)
    except ValueError:
        pass

    try:
        return try_get(obj[key], rest)
    except (KeyError, IndexError):
        return None

并像这样使用它:

intent = try_get(resp, 'entities.intent.0.value')
location = try_get(resp, 'entities.location.0.value')
datetimefrom = try_get(resp, 'entities.datetime.0.values.0.from.value')
datetimeto = try_get(resp, 'entities.datetime.0.values.0.to.value')

JSON不允许使用整数字典键,因此这应该明确允许您遍历从JSON解析的任何对象。