You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过方括号表示法字符串从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:39:03