gpt4 book ai didi

python - cerberus:验证可选字段至少出现一次

转载 作者:行者123 更新时间:2023-12-01 09:12:13 28 4
gpt4 key购买 nike

我正在使用 cerberus 来验证数据。我的一个字段是可选的 - 不需要每一项都存在。但是,该键必须在整个数据数组中至少填充一次。

举个例子,假设我想验证键 'c' 出现在我的数据列表中的至少一个字典中:

from cerberus import Validator

has_c = {'data': [{'a': 1, 'b': 2}, {'b': 2}, {'c': 3}]}
no_c = {'data': [{'a': 1, 'b': 2}, {'a': 1}]}

schema = {'data':
{'type': 'list',
'schema': {
'type': 'dict',
'schema': {
'a': {'required': True},
'b': {'required': True},
'c': {'required': False, 'at_least_one': True}
}
}
}
}

class MyValidator(Validator) # Some fancy code...
....

v = MyValidator()

v.validate(has_c, schema) # Passes
v.validate(no_c, schema) # Fails

这在 cerberus 之外似乎是可行的,但如果可能的话,我想将该方法保留在我的验证器中。

最佳答案

如果您希望该方法位于 Validator 子类中,那么您将需要创建一个自定义规则,就像您所想的那样。

from cerberus import Validator

test_with_c = {'data': [{'a': 1, 'b': 2}, {'b': 2}, {'c': 3}]}
test_with_no_c = {'data': [{'a': 1, 'b': 2}, {'a': 1}]}

class MyValidator(Validator):
def _validate_has_c(self, has_c, field, value):
seen_c = False
for v in value:
if "c" in v:
seen_c = True
if has_c and not seen_c:
self._error(field, "Must contain a 'c' key")

schema = {
"data": {
"type": "list",
"has_c": True
}
}

v = MyValidator(schema)

print(v(test_with_c), v.errors)
print(v(test_with_no_c), v.errors)

运行此命令将产生您想要的在元素之一中查找 c 键的结果。运行该代码会产生

True {}
False {'data': ["Must contain a 'c' key"]}

关于python - cerberus:验证可选字段至少出现一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51562910/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com