如何在处理字典的函数中处理重复的代码块?
How to deal with repeated chunks of code in function dealing with dictionaries?
我有一个嵌套字典,我正在从中提取特定信息。在某些情况下,我想要的信息可能在几个键之一下,或者可能不存在。
我写的代码可以工作,但是有 copy/paste 的味道。在处理潜在的 KeyError
s 时,处理重复代码块的最佳方法是什么?
def getInfo(dic, key):
info = ""
try:
info = dic[key]["other_key_1"]
return "This result " + info
except KeyError:
pass
try:
info = dic[key]["other_key_2"]
return "This result " + info
except KeyError:
pass
try:
info = dic[key]["other_key_3"]
return "This result " + info
except KeyError:
pass
#if they all don't exist
return "This result " + key
您可以将所有可能的键存储在一个列表中并循环遍历它。
这样也可以更轻松地添加新的搜索关键字。
def getInfo(dic, key):
info = ""
possible_keys = ["other_key_1", "other_key_2", "other_key_3"]
for current_key in possible_keys:
try:
info = dic[key][current_key]
return "This result " + info
except KeyError:
pass
#if they all don't exist
return "This result " + key
我会制作一个通用函数,类似于内置的 dict.get
:
def get_first(dct, *keys, default=None):
for key in keys:
try:
return dct[key]
except KeyError:
pass
return default
现在您的 getInfo
可以减少到:
return 'Result ' + get_first(dct[key], 'one', 'two', 'three', default=key)
我有一个嵌套字典,我正在从中提取特定信息。在某些情况下,我想要的信息可能在几个键之一下,或者可能不存在。
我写的代码可以工作,但是有 copy/paste 的味道。在处理潜在的 KeyError
s 时,处理重复代码块的最佳方法是什么?
def getInfo(dic, key):
info = ""
try:
info = dic[key]["other_key_1"]
return "This result " + info
except KeyError:
pass
try:
info = dic[key]["other_key_2"]
return "This result " + info
except KeyError:
pass
try:
info = dic[key]["other_key_3"]
return "This result " + info
except KeyError:
pass
#if they all don't exist
return "This result " + key
您可以将所有可能的键存储在一个列表中并循环遍历它。
这样也可以更轻松地添加新的搜索关键字。
def getInfo(dic, key):
info = ""
possible_keys = ["other_key_1", "other_key_2", "other_key_3"]
for current_key in possible_keys:
try:
info = dic[key][current_key]
return "This result " + info
except KeyError:
pass
#if they all don't exist
return "This result " + key
我会制作一个通用函数,类似于内置的 dict.get
:
def get_first(dct, *keys, default=None):
for key in keys:
try:
return dct[key]
except KeyError:
pass
return default
现在您的 getInfo
可以减少到:
return 'Result ' + get_first(dct[key], 'one', 'two', 'three', default=key)