优化含列表的字典路径值存在性检查,封装通用函数
字典路径含列表的通用取值函数实现
问题背景
已有类似字典路径取值方案,但未覆盖路径中间包含列表的场景。目前通过try-except可实现指定路径的取值(路径不存在则返回"N/A"),但该逻辑重复使用多次,需要封装为通用函数。自行编写的check_dict_path函数无法处理路径中的列表,请求解决。
现有可行实现
try: recommendation["serviceRecommendationOptions"][0]["containerRecommendations"][0]["cpu"] except (KeyError, IndexError): cpu_size = "N/A" else: cpu_size = str( recommendation["serviceRecommendationOptions"][0][ "containerRecommendations" ][0]["cpu"] )
尝试失败的函数
def check_dict_path(d, *indices): sentinel = object() for index in indices: d = d.get(index, sentinel) if d is sentinel: return False return True test_dict = {1: {'blah': [{'blob': 4}]}} print(check_dict_path(test_dict, 1, 'blah', 0, 'blob')) # Fails print(check_dict_path(test_dict, 1, 'blah', 0, 'rob')) # Fails
解决方案
失败原因是原函数仅使用字典的get()方法,而列表不支持该方法。改用try-except遍历路径节点,可同时兼容字典的key和列表的索引:
def get_dict_path_value(d, *path, default="N/A"): current = d try: for key_or_index in path: current = current[key_or_index] return str(current) if not isinstance(current, str) else current except (KeyError, IndexError, TypeError): return default
测试示例
# 测试用字典 test_dict = {1: {'blah': [{'blob': 4}]}} # 路径存在的情况 print(get_dict_path_value(test_dict, 1, 'blah', 0, 'blob')) # 输出: 4 # 路径不存在的情况 print(get_dict_path_value(test_dict, 1, 'blah', 0, 'rob')) # 输出: N/A # 原需求场景测试 recommendation = { "serviceRecommendationOptions": [ { "containerRecommendations": [ {"cpu": 2} ] } ] } cpu_size = get_dict_path_value(recommendation, "serviceRecommendationOptions", 0, "containerRecommendations", 0, "cpu") print(cpu_size) # 输出: 2
函数说明
- 接收目标字典
d和可变参数path(路径节点,可混合字典key和列表索引) - 遍历路径节点逐个取值,若中途出现
KeyError(字典key不存在)、IndexError(列表索引越界)或TypeError(非可索引对象),则返回默认值default - 最终返回路径对应的取值(非字符串类型自动转为字符串),或默认值"N/A"
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

