在 Python 中验证字典

Posted

技术标签:

【中文标题】在 Python 中验证字典【英文标题】:Validate dicts in Python 【发布时间】:2011-08-26 02:16:41 【问题描述】:

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

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

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

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

【问题讨论】:

这种情况很少见。我认为这个特定任务没有解析器。也许你可以在字典上使用map 函数。 另见:***.com/questions/45346374/… 【参考方案1】:

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

【讨论】:

正是我想要的。谢谢你:)【参考方案2】:

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

【讨论】:

从2018年开始折旧,需要改用jsonschema。【参考方案3】:

Webster 是一个 pypi 包,它执行字典验证和值正则表达式验证。这使您可以确保字典具有其应有的所有键,并且值或多或少是您所期望的。

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

【讨论】:

因为这是一个已有 4 年历史的问题,答案已经被接受,如果您提供更多详细信息会更好。您是否提出了更具创新性的解决方案?如果是,请解释一下。您是否复制了建议的示例?【参考方案4】:

我强烈推荐Cerberus 的可读性或jsonschema 因为它使用JSON Schema 标准

【讨论】:

【参考方案5】:

这个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"

【讨论】:

以上是关于在 Python 中验证字典的主要内容,如果未能解决你的问题,请参考以下文章

验证密码和更新字典 Python

简单的数据验证

发现一个秘密:既python3.6之后字典竟然变成了有序集合,我再次验证了一下!

Python中的字典到底是有序的吗

pyhton2 and python3 生成随机数字字母符号字典(用于撞库测试/验证码等)

python - 如何在python scikit-learn中进行字典向量化后预测单个新样本?