如何使用 try/except 块优化代码?
How to optimize the code with try/except block?
我有这样的功能:
def get_nested_dicts(items: dict, *keys, default=None):
for key in keys:
try:
items = items[key]
except KeyError:
return default
else:
if not isinstance(items, dict):
break
return items
主要思想是优化嵌套字典的工作,例如,
我有这样的收缩:
dictionary = {'a': {'b': {'c': 10}}}
输出如下:
print(get_nested_dicts(items, 'a', 'b', 'c')) # 10
print(get_nested_dicts(items, 'a', 'c', 'b')) # None
print(get_nested_dicts(items, 'd', 'e', 'g')) # None
并且想进一步优化它,以更pythonic的方式制作。是否有一些解决方案可以优化它?
您可以使用dict.get()
如下:
def get_nested_dicts(items: dict, *keys, default=None):
for key in keys:
items = items.get(key, default)
if not isinstance(items, dict):
break
return items
输入
dictionary = {'a': {'b': {'c': 10}}}
print(get_nested_dicts(dictionary, 'a', 'b', 'c'))
print(get_nested_dicts(dictionary, 'a', 'c', 'b'))
print(get_nested_dicts(dictionary, 'd', 'e', 'g'))
输出
10
None
None
这里 get()
有两个参数,键和默认值 return。这里它 returns 对应于键的值,如果键存在于字典中,否则 None
是 returned.
我想,.get() 函数可以帮助您稍微优化一下。
def get_nested_dicts(items: dict, *keys, default=None):
for key in keys:
items = items.get(key, default)
if not isinstance(items, dict): break
return items
另一种 pythonic 方式是使用通配符 - 'reduce'.
from functools import reduce
def get_nested_dicts(items: dict, *keys, default=None):
return reduce(lambda v, k: v.get(k, default) if v else default, keys, items)
谢谢。
我有这样的功能:
def get_nested_dicts(items: dict, *keys, default=None):
for key in keys:
try:
items = items[key]
except KeyError:
return default
else:
if not isinstance(items, dict):
break
return items
主要思想是优化嵌套字典的工作,例如, 我有这样的收缩:
dictionary = {'a': {'b': {'c': 10}}}
输出如下:
print(get_nested_dicts(items, 'a', 'b', 'c')) # 10
print(get_nested_dicts(items, 'a', 'c', 'b')) # None
print(get_nested_dicts(items, 'd', 'e', 'g')) # None
并且想进一步优化它,以更pythonic的方式制作。是否有一些解决方案可以优化它?
您可以使用dict.get()
如下:
def get_nested_dicts(items: dict, *keys, default=None):
for key in keys:
items = items.get(key, default)
if not isinstance(items, dict):
break
return items
输入
dictionary = {'a': {'b': {'c': 10}}}
print(get_nested_dicts(dictionary, 'a', 'b', 'c'))
print(get_nested_dicts(dictionary, 'a', 'c', 'b'))
print(get_nested_dicts(dictionary, 'd', 'e', 'g'))
输出
10
None
None
这里 get()
有两个参数,键和默认值 return。这里它 returns 对应于键的值,如果键存在于字典中,否则 None
是 returned.
我想,.get() 函数可以帮助您稍微优化一下。
def get_nested_dicts(items: dict, *keys, default=None):
for key in keys:
items = items.get(key, default)
if not isinstance(items, dict): break
return items
另一种 pythonic 方式是使用通配符 - 'reduce'.
from functools import reduce
def get_nested_dicts(items: dict, *keys, default=None):
return reduce(lambda v, k: v.get(k, default) if v else default, keys, items)
谢谢。