Python 嵌套字典中的递归函数
我有这样的嵌套dict,其中键是函数Python 嵌套字典中的递归函数,python,recursion,Python,Recursion,我有这样的嵌套dict,其中键是函数{'Foo1':{'Foo2':{'value1':0},'Foo3':{'value2':1,'value3':1}} 我想写一个递归函数,它必须计算一个最终值。在这种情况下,它将是: final_value = Foo1(Foo2(0), Foo3(1,1)) 如果有人帮我提建议,我会很高兴的 对于您的特定情况,我建议使用一个明确的白名单,列出允许映射到Python中函数的函数名(请参阅下面代码中的whitelist)。如果您试图解析不受信任的数据,这将
{'Foo1':{'Foo2':{'value1':0},'Foo3':{'value2':1,'value3':1}}
我想写一个递归函数,它必须计算一个最终值。在这种情况下,它将是:
final_value = Foo1(Foo2(0), Foo3(1,1))
如果有人帮我提建议,我会很高兴的 对于您的特定情况,我建议使用一个明确的白名单,列出允许映射到Python中函数的函数名(请参阅下面代码中的
whitelist
)。如果您试图解析不受信任的数据,这将缓解许多潜在的严重安全问题。它还处理您的“none”
需求,该需求没有映射到Python中的实际函数
代码的重要部分是parse
函数。它递归地遍历输入数据,并将每个键分类为函数或变量名。如果它是一个函数,它将使用该键的值调用该函数。否则,它只使用该值。无论哪种方式,该信息都会保存到结果中,然后递归地传递给调用者
请注意,此实现甚至没有开始尝试处理格式错误的输入。我强烈建议将parse
包装成试试。。。catch
块以优雅地处理错误输入
data = {
'any': {
'none': {'value1': 0},
'sum': {'value2': 0, 'value3': 1}
}
}
# This can be expanded to include other functions that aren't built-in.
# Note that "none" is special because "not" isn't actually a function.
WHITELIST = {
"any": any,
"all": all,
"sum": sum,
"none": lambda x: not x
"10": is_10 # Sample additional function you could add.
}
def is_10(values):
return sum(values) == 10
def parse(data):
results = []
# Uncomment the next line if you're on Python 2.
# for key, value in d.iteritems():
# Leave this line if you're on Python 3.
for key, value in data.items():
if key in WHITELIST:
# This is a function.
function = WHITELIST[key]
args = parse(value)
results.append(function(args))
else:
# This is a value, so the name doesn't actually matter.
results.append(value)
return results
print(parse(data))
对于代码顶部的示例,它打印[True]
,因为它们是位于数据根的单个函数。如果你的数据总是有一个根函数,你可能想调用parse作为output=parse(data)[0]
你能把字典的实际例子作为函数吗?因为字典是无序的,你的最终值也可能是Foo1(Foo3(1,1),Foo2(0))
-这可能是完全不同的。谢谢你的评论,但这里的顺序并不重要。可能是你写的。最后的_值不会改变@ChristianKönig@AmeyDahale例如:dct={'any':{'none':{'value1':0},'all':{'value2':1,'value3':1}谢谢!“None”不适用于列表(不是([0])返回False,但应该返回True),但我会修复它。