Python 嵌套字典中的递归函数

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)。如果您试图解析不受信任的数据,这将

我有这样的嵌套dict,其中键是函数
{'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),但我会修复它。