我有一个嵌套的配置字典,并且需要一个函数来测试密钥是否存在(最高级别)。我想出了这个简单的函数,但是它失败了,因为在最后一个项目上,我只得到一个字符串,而len(test)返回了字符串项目的长度。除了测试的第一个元素外,我是否需要更改所有其他方法的分配方式?
conf = {'a':{'b':{'c': [1,2,3]}}}
def has_conf_value(*key_path):
remaining = conf
test = key_path
while len(test) > 1:
if test[0] in remaining:
remaining = remaining[test[0]]
test = test[-1]
else:
return False
return test[0] in remaining
has_conf_value('a','b','c')
我希望是真的
答案 0 :(得分:1)
为什么不递归地
def has_conf_value(conf, *key_path):
assert len(key_path) > 0
if len(key_path) == 1:
return key_path[0] in conf
if key_path[0] in conf:
return has_conf_value(conf[key_path[0]], *key_path[1:])
return False
或
def has_conf_value(conf, *key_path):
assert len(key_path) > 0
if len(key_path) == 1:
return key_path[0] in conf
return has_conf_value(conf[key_path[0]], *key_path[1:]) if key_path[0] in conf else False
简而言之。但是,如果要使其与当前代码保持相似,只需更改原始实现
test = test[-1]
到
test = test[1:]
否则您将丢弃大部分列表。有关为什么 test[-1]
错误的更多描述性解释,请参见ShioT的评论。