无法使用 Python 和 Cerberus 验证重复值列表
Cant validate a list of values for duplicates using Python and Cerberus
我对 Python 和 Cerberus 还很陌生。
我有一个要求,我需要验证任何空字符串或重复项的列表。以下是我所做的:
import cerberus
myschema = {'uid': {'type': 'list', 'schema': {'type': 'string', 'required' : True}}}
cerberus.rules_set_registry.add('myschema', myschema)
newval = Validator(myschema)
test = {'uid' : {'10000', '10001', '10002', '10003', '10004', '10005'}}
newval.validate(test)
出于某种原因,输出总是 'False'。
或者,我尝试了 'oneof' of-rules 并提出了以下内容:
from cerberus import Validator
document = {'column_name' : ['BLAH', 'SEX', 'DOMAIN', 'DOMAIN']}
schema = {'column_name' : {'oneof' : [{'type': 'list', 'contains' : ['DOMAIN']}]} }
v = Validator(schema)
v.validate(document, schema)
以上总是return正确。我希望 'oneof' 可以验证重复项并且上述是正确的方法。
如果我错了,这里的任何人都可以纠正我吗?
提前致谢,
尼克斯
好的。
我找不到 Cerberus 验证器的答案来检查列表中的重复项。
我检查了 Json Schema,它真的很容易。下面是代码:
from jsonschema import validate
schema = { "type": "array", "uniqueItems": True}
mylist = ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
# Returns None if validated; else a validation error
validate(instance = mylist, schema = schema)
在 Cerberus 中,验证 returns 如果验证正确则为 True;否则为假。然而,Json 架构 returns a None(在 Python 中)如果验证正确,则会抛出验证错误,如下所示:
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
<ipython-input-1-efa3c7f0da39> in <module>
5 mylist = ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
6
----> 7 ans = validate(instance = mylist, schema = schema)
8 if(ans == None): print('Validated as True')
~/Library/Python/3.8/lib/python/site-packages/jsonschema/validators.py in validate(instance, schema, cls, *args, **kwargs)
932 error = exceptions.best_match(validator.iter_errors(instance))
933 if error is not None:
--> 934 raise error
935
936
ValidationError: ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000'] has non-unique elements
Failed validating 'uniqueItems' in schema:
{'type': 'array', 'uniqueItems': True}
On instance:
['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
test = {'uid' : {'10000', '10001', '10002', '10003', '10004', '10005'}}
这不是 json 中列表的有效表示。以下为
test = {'uid' : ['10000', '10001', '10002', '10003', '10004', '10005']}
这就是 Cerberus returns 错误的原因。您可以使用 print(newval.errors)
打印该 json 对象的所有错误。
至于 oneOf
,Cerberus 将验证您在列表中的项目将完全满足限制列表中提到的 one
限制。它不检查元素之间的关系。
我对 Python 和 Cerberus 还很陌生。 我有一个要求,我需要验证任何空字符串或重复项的列表。以下是我所做的:
import cerberus
myschema = {'uid': {'type': 'list', 'schema': {'type': 'string', 'required' : True}}}
cerberus.rules_set_registry.add('myschema', myschema)
newval = Validator(myschema)
test = {'uid' : {'10000', '10001', '10002', '10003', '10004', '10005'}}
newval.validate(test)
出于某种原因,输出总是 'False'。
或者,我尝试了 'oneof' of-rules 并提出了以下内容:
from cerberus import Validator
document = {'column_name' : ['BLAH', 'SEX', 'DOMAIN', 'DOMAIN']}
schema = {'column_name' : {'oneof' : [{'type': 'list', 'contains' : ['DOMAIN']}]} }
v = Validator(schema)
v.validate(document, schema)
以上总是return正确。我希望 'oneof' 可以验证重复项并且上述是正确的方法。
如果我错了,这里的任何人都可以纠正我吗?
提前致谢,
尼克斯
好的。
我找不到 Cerberus 验证器的答案来检查列表中的重复项。
我检查了 Json Schema,它真的很容易。下面是代码:
from jsonschema import validate
schema = { "type": "array", "uniqueItems": True}
mylist = ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
# Returns None if validated; else a validation error
validate(instance = mylist, schema = schema)
在 Cerberus 中,验证 returns 如果验证正确则为 True;否则为假。然而,Json 架构 returns a None(在 Python 中)如果验证正确,则会抛出验证错误,如下所示:
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
<ipython-input-1-efa3c7f0da39> in <module>
5 mylist = ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
6
----> 7 ans = validate(instance = mylist, schema = schema)
8 if(ans == None): print('Validated as True')
~/Library/Python/3.8/lib/python/site-packages/jsonschema/validators.py in validate(instance, schema, cls, *args, **kwargs)
932 error = exceptions.best_match(validator.iter_errors(instance))
933 if error is not None:
--> 934 raise error
935
936
ValidationError: ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000'] has non-unique elements
Failed validating 'uniqueItems' in schema:
{'type': 'array', 'uniqueItems': True}
On instance:
['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
test = {'uid' : {'10000', '10001', '10002', '10003', '10004', '10005'}}
这不是 json 中列表的有效表示。以下为
test = {'uid' : ['10000', '10001', '10002', '10003', '10004', '10005']}
这就是 Cerberus returns 错误的原因。您可以使用 print(newval.errors)
打印该 json 对象的所有错误。
至于 oneOf
,Cerberus 将验证您在列表中的项目将完全满足限制列表中提到的 one
限制。它不检查元素之间的关系。