Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python类赋值中执行许多try-except块的最佳方法是什么?_Python_Json - Fatal编程技术网

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

在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

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