Более элегантный способ справиться с несколькими исключениями KeyError

У меня есть следующая функция, которая читает 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 ответа

Решение

Просто используйте dict.get, Каждое использование:

try:
    country        = data['country']     
except KeyError:
    country = ''

можно эквивалентно заменить на:

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

Вместо этого вы можете перебирать ключи и try для каждого key, в случае успеха добавить его в список и в случае неудачи добавить " ":

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

Затем в конце функции вернуть кортеж:

return tuple(ret)

если это необходимо.

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)
Другие вопросы по тегам