在Python类赋值中执行许多try-except块的最佳方法是什么?
我有一个类,它用键来提取JSON数据,但问题是这个类的每个实例,JSON数据可能没有我试图获取的所有东西的键。目前,我的班级设置如下:在Python类赋值中执行许多try-except块的最佳方法是什么?,python,json,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.da
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)行。有更好的办法吗?最后,如果JSON键不存在,我希望分配一个参数
None
。如果要为属性设置默认值(如果属性不在数据
字典中),请使用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')
如果要在属性不在
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')
使用,它提供默认值,而不是引发缺少键的异常
例如,您可以更改以下内容:
self.status = self.data['status']
为此:
self.status = self.data.get('status')
使用,它提供默认值,而不是引发缺少键的异常
例如,您可以更改以下内容:
self.status = self.data['status']
为此:
self.status = self.data.get('status')
您可以将代码更改为以下内容:
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
实例访问不是数据
字典中键的内容,则会引发属性错误
您可以将代码更改为以下内容:
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
实例中访问数据字典中没有键的内容,将引发属性错误太棒了,谢谢!嵌套键的语法是什么?一些参数多达3个键深,例如[“网络”][“国家”][“时区”]是否保证存在中间字典?如果是这样,您只需在最后一级(项目可能不存在的地方)使用get
。如果正在使用的字典可能不存在,那么您必须在每个级别使用get
,默认为空字典:data.get(“网络”)、{}.get(“国家”)、{}.get(“时区”)
Perfect!中级词典不能保证存在,所以我会在每一级中使用.get。非常感谢你!嗯,看起来这实际上不适用于嵌套的dict。我从codeself.data.get(“网络”)、{}.get(“国家”)、{}.get(“时区”)、{})中获取:AttributeError:'NoneType'对象没有属性“get”
,如果JSON中的字典中已经有None
值,那么get
将不允许您选择其他默认值。您必须使用尝试
/除非
或其他条件逻辑(例如,如果数据[“网络”]无
…),太棒了,谢谢!嵌套键的语法是什么?一些参数多达3个键深,例如[“网络”][“国家”][“时区”]是否保证存在中间字典?如果是这样,您只需在最后一级(项目可能不存在的地方)使用get
。如果正在使用的字典可能不存在,那么您必须在每个级别使用get
,默认为空字典:data.get(“网络”)、{}.get(“国家”)、{}.get(“时区”)
Perfect!中级词典不能保证存在,所以我会在每一级中使用.get。非常感谢你!嗯,看起来这实际上不适用于嵌套的dict。我从codeself.data.get(“网络”)、{}.get(“国家”)、{}.get(“时区”)、{})中获取:AttributeError:'NoneType'对象没有属性“get”
,如果JSON中的字典中已经有None
值,那么get
将不允许您选择其他默认值。您必须使用尝试
/除非
或其他条件逻辑(例如,如果数据[“网络”]为无
…),酷!从不知道dict.update()。不幸的是,我不确定这是否适用于我想要公开的嵌套值,我需要对数据['network']['country']['name']等进行显式赋值。也许我需要接受这一点,让用户在需要时更深入地挖掘,而不是试图将所有内容都变成对象属性。酷!从不知道dict.update()。不幸的是,我不确定这是否适用于我想要公开的嵌套值,我需要对数据['network']['country']['name']等进行显式赋值。也许我需要接受这一点,让用户在需要时更深入地挖掘,而不是试图将所有内容都变成对象属性。