【问题标题】:Alternative to multiple try/except statements to check if a field exists替代多个 try/except 语句来检查字段是否存在
【发布时间】:2014-03-16 21:53:58
【问题描述】:

我正在从 Facebook Graph Explorer API 中提取一些信息。 API 的输出是一个 JSON 对象。
有时输出包含我正在寻找的字段(即教育、学校名称等),有时它不包含。为了弥补这一点,我不得不为我要查找的每个 json 字段编写一个 try/except/else 块:

 # gender
 try:
     gender=json_dict['gender']

     if gender=='male':
         gender= unicode('M')
     elif gender=='female':
         gender=unicode('F')
 except:
     pass

 #birthday    
 try:
     birthday=json_dict['birthday']

     if len(birthday)==10:
         birthday=int(birthday[6:])
     else:
         birthday=unicode('NULL')
 except:
     pass

 #hometown id
 try:
     hometown_id=int(json_dict['hometown']['id'])
 except:
     pass

不断地不断。这种方法有效,但它似乎有点……笨拙?它适用于我的目的,因为我只在寻找六个字段左右。有没有更好/更聪明的方法来扩大这个过程?

【问题讨论】:

    标签: json api python-2.7


    【解决方案1】:

    使用dict.get(key)dict.get(key, defaultValue)

    try:
        gender=json_dict['gender']
    
        if gender=='male':
            gender= unicode('M')
        elif gender=='female':
            gender=unicode('F')
    except:
        pass
    

    会翻译成

    gender=json_dict.get('gender')
    if gender=='male':
            gender= unicode('M')
    elif gender=='female':
            gender=unicode('F')
    else:
         gender = None # is the default case. no need to write that.
    

    gender={'male':u'M', 'female':u'F'}.get(json_dict.get('gender'))
    

    您也可以使用in 进行测试:

    if 'gender' in json_dict:
        gender=json_dict['gender']
    
        if gender=='male':
            gender= unicode('M')
        elif gender=='female':
            gender=unicode('F')
    else: pass# gender is not defined, NameError possible
    

    【讨论】:

      【解决方案2】:

      首先,您不应该使用 except 而不指定要捕获的内容。它可能会导致一些调试问题。

      在你的情况下,你可以使用dict.get() method:

      如果key 在字典中,则返回key 的值,否则返回default。如果未给出default,则默认为None,因此此方法永远不会引发KeyError

      所以我们得到类似的东西:

      genders = {'male': unicode('M'), 'female': unicode('F')}
      # if gender isn't found or isn't equal to 'male' or 'female', we return 'NULL'
      gender = genders.get(json_dict.get('gender'), unicode('NULL'))
      
      birthday = json_dict.get('birthday')
      if len(birthday) == 10:
          birthday = int(birthday[6:])
      else:
          birthday = unicode('NULL')
      

      等等

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-10
        • 2014-09-04
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2013-04-10
        • 2019-09-07
        相关资源
        最近更新 更多