Python 根据需求递归检查dict和列表项类型的有效性

Python 根据需求递归检查dict和列表项类型的有效性,python,list,dictionary,types,Python,List,Dictionary,Types,注意:如果能为这个问题找到一个更准确的名字就好了 最近,我不得不编写一个脚本来验证字典结构。此字典结构可以由内部的一些其他列表或字典结构组成,也可以由具有任何值的基本类型组成(dict、list、str和int)。有些键是必需的,有些是可选的。以下是一个例子: dictionary = { "key1" : required({ "key1.1": optional([ required(int), required(str

注意:如果能为这个问题找到一个更准确的名字就好了

最近,我不得不编写一个脚本来验证字典结构。此字典结构可以由内部的一些其他列表或字典结构组成,也可以由具有任何值的基本类型组成(
dict
list
str
int
)。有些键是必需的,有些是可选的。以下是一个例子:

dictionary = {
    "key1" : required({
        "key1.1": optional([
            required(int),
            required(str),
            optional(str),
            required(int)
            ]),
        "key1.2": required(int)
        }),
    "key2" : optional(int),
    "key3" : required([
            optional(int),
            optional(str),
            required(int)
            ]),
    "key4" : optional(dict),  # Dictionary of any kind allowed
    }
下面是一些有效/无效字典的示例

# valid
d1 = {"key1": {"key1.2": 3}, "key2": 42, "key3": ["toto", 42]}

# invalid (because of the order in the list of d["key3"])
d2 = {"key1": {"key1.2": 3}, "key2": 42, "key3": [42, "toto"]}

# valid
d3 = {"key1": {"key1.2": 3, "key1.1": [3, "toto", 12]}, "key3": [42]}

# invalid (because of invalid type of d["key2"]
d4 = {"key1": {"key1.2": 3}, "key2": "bad type", "key3": [42]}

# invalid (missing d["key1"] required)
d5 = {"key3": [42]}

# valid (any kind of dictionary is allowed in key4)
d6 = {"key1": {"key1.2": 42}, "key3": [42], "key4": {}}

# valid (any kind of dictionary is allowed in key4)
d7 = {"key1": {"key1.2": 42}, "key3": [42], "key4": {"poney": "amazing"}}
我对
required
optional
的实现只需返回一个元组,该元组带有一个布尔值,指示是否需要该项。它可以修改

def required(entity):
    return (True, entity)

def optional(entity):
    return (False, entity)
目标:生成一个函数,将字典作为参数进行检查(
d1
d2
d3
…)和验证器(
dictionary
),并返回一个指示字典是否有效的布尔值


我制作了脚本的一部分来验证字典结构,但是它很长,并且不验证列表结构(比如
dictionary[“key1”][“key1.1”]
,我一直坚持这一点)。我可以把它贴在这里,但我觉得它只会解决这个问题…

你可以通过考虑你允许的字典结构来解决这个问题,比如指定语法的句子,然后像编译器那样用递归下降解析器来验证它。这看起来是个好主意。我会努力的。