Galmi
Galmi

Reputation: 763

Validate dicts in Python


i looking for tool, or examples to/how to validate dictionaries in python.
For example, i have dict:

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

And now i must validate it. Lets say, value for key foo must be boolean False or non-empty string. Next, if key foo1 have value bar1, that key foo2 must be int in range 1..10. I wrote simple function to do this, but this is not what i exactly want. Yea, sure, i can test every single item in dict with if..else, but if dict have >50 elements, then it is a bit not comfortable.

Is there any good tool/lib to do this in Python? I not looking for parsers, only fast and effective way to do this right.

Upvotes: 19

Views: 18012

Answers (5)

Jean DuPont
Jean DuPont

Reputation: 451

This dict-schema-validator package is a very simple way to validate python dictionaries.

Here is a simple schema representing a Customer:

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

Validation:

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":    "[email protected]",
        "skype":    "j.york123"
    },
    "cards": [
        {"type": "visa", "expires": "12/2029"},
        {"type": "visa"},
    ]
}

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

Output:

[*] "_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"

Upvotes: 0

Kamil Sindi
Kamil Sindi

Reputation: 22832

I highly recommend Cerberus for its readability or jsonschema because it uses the JSON Schema standard

Upvotes: 3

David Lenwell
David Lenwell

Reputation: 1

Webster is a pypi package that does dictionary validation and value regex validation.. this allows you to insure that the dictionary has all the keys its supposed to and the values are more or less what you would expect.

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

Upvotes: 0

Vidz
Vidz

Reputation: 617

You can also try the link below:
https://github.com/sunlightlabs/validictory
Its a great package that helps in validation in an easier way

Upvotes: 4

anijhaw
anijhaw

Reputation: 9402

Voluptous is a nice tool that does this http://pypi.python.org/pypi/voluptuous

Upvotes: 29

Related Questions