我正在使用Cerberus验证CSV文件,但在我认为是一些基本逻辑的情况下却遇到了麻烦
场景:
CSV文件有2列。Column 2
仅当Column 1
具有值时才需要具有值。如果Column 1
为空,则Column 2
也应该为空。
我以为这将是编写最直接的规则之一,但到目前为止,没有任何事情像预期的那样起作用。
下面是使用python字典的相同逻辑。
from cerberus import Validator
v = Validator()
schema = {
"col1": {"required": False},
"col2": {"required": True, "dependencies": "col1"},
}
document = {
"col1": "a",
"col2": ""
}
v.validate(document, schema) # This responds with True!? Why?
v.errors
{}
我希望在Column 2
这里出现错误,因为Column 1
已经提供了,但是这里的结果True
意味着没有错误
注意
此规则(dependencies
)的评估不考虑该required
规则定义的任何约束。
不管是什么"required"
:
from cerberus import Validator
v = Validator()
document = {
"col1": "a",
"col2": ""
}
schema = {
"col1": {"required": False},
"col2": {"required": True, "dependencies": "col1"},
}
print(v.validate(document, schema)) # True
print(v.errors) # {}
schema = {
"col1": {"required": True},
"col2": {"required": True, "dependencies": "col1"},
}
print(v.validate(document, schema)) # True
print(v.errors) # {}
schema = {
"col1": {"required": True},
"col2": {"required": False, "dependencies": "col1"},
}
print(v.validate(document, schema)) # True
print(v.errors) # {}
http://docs.python-cerberus.org/en/stable/validation-rules.html#dependencies
更新:
您的条件的解决方案“如果col1中包含一个值,则使col2为强制性。 ”。
要应用复杂的规则,请创建一个自定义验证器,如下所示:
from cerberus import Validator
class MyValidator(Validator):
def _validate_depends_on_col1(self, depends_on_col1, field, value):
""" Test if a field value is set depending on `col1` field value.
"""
if depends_on_col1 and self.document.get('col1', None) and not value:
self._error(field, f"`{field}` cannot be empty given that `col1` has a value")
v = MyValidator()
schema = {
"col1": {"required": False},
"col2": {"required": True, "depends_on_col1": True},
}
print(v.validate({"col1": "a", "col2": ""}, schema)) # False
print(v.errors) # {'col2': ['`col2` cannot be empty given that `col1` has a value']}
print(v.validate({"col1": "", "col2": ""}, schema)) # True
print(v.errors) # {}
print(v.validate({"col1": 0, "col2": "aaa"}, schema)) # True
print(v.errors) # {}
注意,您需要约定哪些列col1
值应视为空的约定(以调整自定义验证器规则)。
扩展版本以指定“依赖项”字段名称:
class MyValidator(Validator):
def _validate_depends_on_col(self, col_name, field, value):
""" Test if a field value is set depending on `col_name` field value.
"""
if col_name and self.document.get(col_name, None) and not value:
self._error(field, f"`{field}` cannot be empty given that `{col_name}` has a value")
v = MyValidator()
document = {"col1": "a", "col2": ""}
schema = {
"col1": {"required": False},
"col2": {"required": True, "depends_on_col": "col1"},
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句