在Python中验证dicts

时间:2011-05-15 23:10:39

标签: python validation dictionary schema associative-array


我在python中寻找工具或示例来/如何验证字典 例如,我有dict:

test = {'foo' : 'bar', 'nested' : {'foo1' : 'bar1', 'foo2' : 'bar2'} }

现在我必须验证它。可以说,键foo的值必须是布尔 False 或非空字符串。接下来,如果键foo1的值为bar1,则该键foo2 必须在范围1..10中为int。我写了简单的函数来做到这一点,但这不是我想要的。是的,当然,我可以使用if..else测试dict中的每个项目,但是如果dict有> 50个元素,那么它有点不舒服。

在Python中有没有好的工具/库?我不是在寻找解析器,只是快速和有效的方法来做到这一点。

5 个答案:

答案 0 :(得分:27)

Voluptous是一个很好的工具,可以做到这一点 http://pypi.python.org/pypi/voluptuous

答案 1 :(得分:4)

您也可以尝试以下链接:
https://github.com/sunlightlabs/validictory
它是一个很好的包,有助于以更简单的方式验证

答案 2 :(得分:2)

我强烈建议Cerberus为其可读性或jsonschema,因为它使用JSON Schema标准

答案 3 :(得分:0)

Webster是一个pypi包,可以进行字典验证和值正则表达式验证。这可以让你确保字典中包含了它应该具有的所有键,并且值或多或少都是你所期望的。

https://pypi.python.org/pypi/Webster

答案 4 :(得分:0)

dict-schema-validator软件包是验证python词典的一种非常简单的方法。

这是代表客户的简单架构:

{
  "_id":          "ObjectId",
  "created":      "date",
  "is_active":    "bool",
  "fullname":     "string",
  "age":          ["int", "null"],
  "contact": {
    "phone":      "string",
    "email":      "string"
  },
  "cards": [{
    "type":       "string",
    "expires":    "date"
  }]
}

验证:

from datetime import datetime
import json
from dict_schema_validator import validator


with open('models/customer.json', 'r') as j:
    schema = json.loads(j.read())

customer = {
    "_id":          123,
    "created":      datetime.now(),
    "is_active":    True,
    "fullname":     "Jorge York",
    "age":          32,
    "contact": {
        "phone":    "559-940-1435",
        "email":    "york@example.com",
        "skype":    "j.york123"
    },
    "cards": [
        {"type": "visa", "expires": "12/2029"},
        {"type": "visa"},
    ]
}

errors = validator.validate(schema, customer)
for err in errors:
    print(err['msg'])

输出:

[*] "_id" has wrong type. Expected: "ObjectId", found: "int"
[+] Extra field: "contact.skype" having type: "str"
[*] "cards[0].expires" has wrong type. Expected: "date", found: "str"
[-] Missing field: "cards[1].expires"