无法使用 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 限制。它不检查元素之间的关系。