更优雅的方式来处理多个KeyError异常

时间:2016-07-04 16:24:32

标签: python json python-3.x rdap

我有以下函数,它读取dict并影响局部变量的某些值,然后将它们作为元组返回。

问题是字典中可能不存在某些所需的键。

到目前为止,我有这个代码,它做了我想要的,但我想知道是否有更优雅的方式来做它。

def getNetwork(self, search):

    data = self.get('ip',search)
    handle         = data['handle']
    name           = data['name']
    try:
        country        = data['country']     
    except KeyError:
        country = ''
    try:       
        type           = data['type']
    except KeyError:
        type = ''
    try:                
        start_addr     = data['startAddress']
    except KeyError:
        start_addr = ''
    try:                 
        end_addr       = data['endAddress']
    except KeyError:
        end_addr = '' 
    try:                  
        parent_handle  = data['parentHandle']
    except KeyError:
        parent_handle = ''   
    return (handle, name, country, type, start_addr, end_addr, parent_handle)

我对众多try: except:感到害怕,但是如果我将所有的影响放在一个try: except:中,一旦第一个丢失的dict键引发错误,它就会停止影响值。

3 个答案:

答案 0 :(得分:3)

只需使用try: country = data['country'] except KeyError: country = '' 即可。每次使用:

country = data.get('country', '')

可以等效地替换为:

{{1}}

答案 1 :(得分:1)

您可以为每个public class XptoConverter extends SimpleFormatter<Xpto> { @Override public Xpto parse(String input, Locale l) throws ParseException { return new Xpto().setId(Long.valueOf(input)); } @Override public String print(Xpto xpto, Locale l) { return xpto.getId().toString(); } } 重复密钥和try,成功后将其附加到列表中,并在失败后附加key

" "

然后在函数结束时返回一个元组:

ret = []
for key in {'country', 'type', 'startAddress', 'endAddress', 'parentHandle'}:
    try:
        ret.append(data[key])
    except KeyError: 
        ret.append([" "])

如果有必要的话。

答案 2 :(得分:0)

Thx ShadowRanger,你回答我去了下面的代码,这确实更容易阅读:

def getNetwork(self,search):

data = self.get('ip',search)
handle         = data.get('handle', '')
name           = data.get('name', '')
country        = data.get('country','')
type           = data.get('type','')
start_addr     = data.get('start_addr','')
end_addr       = data.get('end_addr','')
parent_handle  = data.get('parent_handle','')
return (handle, name, country, type, start_addr, end_addr, parent_handle)