在Python类分配中执行许多try-except块的最佳方法是什么?

时间:2015-09-23 23:42:26

标签: python json

我有一个用键提取JSON数据的类,但问题是,对于这个类的每个实例,JSON数据可能没有我想要抓取的所有内容的键。目前,我的班级设置如下:

class Show():
    def __init__(self, data):
        self.data = data
        self.status = self.data['status']
        self.rating = self.data['rating']
        self.genres = self.data['genres']
        self.weight = self.data['weight']
        self.updated = self.data['updated']
        self.name = self.data['name']
        self.language = self.data['language']
        self.schedule = self.data['schedule']
        self.url = self.data['url']
        self.image = self.data['image']

依此类推,参数不止于此。我试图避免为每个(27)行中的每一个都设置一个try-except块的混乱。有没有更好的办法?最终,如果JSON密钥不存在,我希望为None分配一个参数。

3 个答案:

答案 0 :(得分:2)

如果您要为该属性设置默认值(如果该属性不在data词典中),请使用data.get('key')而不是data['key']。如果密钥不存在,get方法将返回None,而不是引发KeyError异常。如果您想要一个不同于None的默认值,您可以将第二个参数传递给get,这将是返回的内容。

所以,你的代码可能变成:

class Show():
  def __init__(self, data):
    self.data = data
    self.status = self.data.get('status')
    self.rating = self.data.get('rating')
    self.genres = self.data.get('genres')
    self.weight = self.data.get('weight')
    self.updated = self.data.get('updated')
    self.name = self.data.get('name')
    self.language = self.data.get('language')
    self.schedule = self.data.get('schedule')
    self.url = self.data.get('url')
    self.image = self.data.get('image')

答案 1 :(得分:1)

使用dict.get,它提供默认值,而不是为丢失的密钥引发异常。

例如,您可以更改此内容:

self.status = self.data['status']

进入这个:

self.status = self.data.get('status')

答案 2 :(得分:1)

您可以将代码更改为:

class Show():
    def __init__(self, data):
        self.data = data
        self.__dict__.update(data)

data = {'status': True, 'ratings': [1,2,3], 'foo': "blahblah"}

aShow = Show(data)
"""
>>> aShow.status
True
>>> aShow.ratings
[1,2,3]
>>> aShow.something_not_in_dict
AttributeError: Show instance has no attribute 'something_not_in_dict'
"""

完全相同,尝试访问Show实例中不是data字典中的密钥的内容会引发AttributeError