2017-09-18 6 views
1

私は入れ子リストと辞書を含む辞書を解析しようとしています。私は、特定のキーが存在するかどうかを検出し、その値を適切な変数に保存しようとしています。以下のコードは動作しますが、信じられないほど乱雑です。これを適切に処理する方法はありますか?Try/Except in Python:辞書の解析に適していますか?

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'value':u'value ':u'like'}]}、u'msg_id ':u'0jkzwqMkSkpZsKJYx'、u'_text ':u'天気はどうですか? '}

+0

私によく見えます。私はこれをやるのが面倒な方法はないとは思わない。 – DyZ

+0

これを行う簡潔な方法が欲しいのですか? – aircraft

+0

私はswitch文を使用してnullやそのようなものを調べることに慣れていたと思います。これは本当にPythonでこれを行う適切な方法ですか?私はこれが非常に大きなブロックとなることを心配しています。もっと簡潔な方法があれば、私はそれを使いたいです。 – Metasyntactic

答えて

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から解析された任意のオブジェクトを横断できるようにする必要があります。

関連する問題