Более элегантный способ справиться с несколькими исключениями 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)