如何通过变量指定的键路径访问Python字典?遇KeyError报错
解决Python中用字符串键路径访问嵌套字典的KeyError问题
你的问题出在把整个键路径字符串当成了单个字典键——testeobj[nav]相当于在找键为"['c']['d']"的条目,但你的字典里根本没有这个键,自然抛出KeyError。而直接写testeobj['c']['d']是链式访问:先取testeobj['c']得到内层字典,再取这个字典的'd'键,这和用字符串当单个键完全是两回事。
下面是几种安全可行的解决方法:
方法1:手动拆分键路径,逐层访问
先把路径字符串拆解成单个键,再逐层遍历字典:
testeobj = {'a': 'b', 'c': {'d': {'e':'f'}}} nav = "['c']['d']" # 拆分字符串提取所有键 keys = [key.strip("'[]") for key in nav.split('][')] # 逐层访问嵌套字典 current = testeobj for key in keys: current = current[key] print(current) # 输出: {'e': 'f'}
方法2:用functools.reduce简化代码
借助reduce和operator.getitem可以把逐层访问的逻辑压缩成一行:
from functools import reduce import operator testeobj = {'a': 'b', 'c': {'d': {'e':'f'}}} nav = "['c']['d']" keys = [key.strip("'[]") for key in nav.split('][')] result = reduce(operator.getitem, keys, testeobj) print(result) # 输出: {'e': 'f'}
绝对要避免的方法:eval
虽然eval(f"testeobj{nav}")能得到正确结果,但如果nav是来自不可信的输入(比如用户输入),这种写法会执行任意代码,存在严重的安全风险,绝对不要使用。
内容的提问来源于stack exchange,提问作者Alexandre Gomes dos Santos
相关产品推荐
相关产品推荐

