如何通过方括号表示法字符串从Python字典中提取嵌套值
方案1:安全解析路径实现(推荐)
核心思路是先过滤路径字符串中的无关符号,拆分出每一层的key列表,再遍历字典逐层取值,完全规避代码注入风险。
独立函数实现
def grab(d: dict, path: str, default=None): import re # 提取所有引号包裹的key keys = re.findall(r"['\"](.*?)['\"]", path) current = d try: for key in keys: current = current[key] return current except (KeyError, TypeError): # 路径不存在/层级不匹配时返回默认值 return default
测试示例
my_dict = {"vms": {"vm": {"name": "test-vm", "desc": "test"}}} print(grab(my_dict, "vms['vm']")) # 输出 {'name': 'test-vm', 'desc': 'test'} print(grab(my_dict, "vms['vm']['name']")) # 输出 test-vm print(grab(my_dict, "vms['vm']['not_exist']", default="缺省值")) # 输出 缺省值
扩展为字典方法
如果要实现示例中的my_dict.grab()调用形式,可以继承dict自定义类:
class GrabDict(dict): def grab(self, path: str, default=None): import re keys = re.findall(r"['\"](.*?)['\"]", path) current = self try: for key in keys: current = current[key] return current except (KeyError, TypeError): return default # 使用示例 my_dict = GrabDict({"vms": {"vm": {"name": "test-vm", "desc": "test"}}}) print(my_dict.grab("vms['vm']['name']")) # 输出 test-vm
方案2:eval简易实现(仅可信场景使用)
如果路径字符串完全来自你可控的配置文件,不存在外部用户篡改的可能,可以用更简短的写法:
def grab(d: dict, path: str, default=None): try: return eval(f"_d{path}", {"_d": d}) except (KeyError, TypeError, SyntaxError): return default
注意:该方案存在代码注入风险,若路径字符串可被外部用户修改,禁止使用。
内容的提问来源于stack exchange,提问作者John Mansell
相关产品推荐
相关产品推荐

