在 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 中验证字典的主要内容,如果未能解决你的问题,请参考以下文章
发现一个秘密:既python3.6之后字典竟然变成了有序集合,我再次验证了一下!