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”]
,我一直坚持这一点)。我可以把它贴在这里,但我觉得它只会解决这个问题…你可以通过考虑你允许的字典结构来解决这个问题,比如指定语法的句子,然后像编译器那样用递归下降解析器来验证它。这看起来是个好主意。我会努力的。