1

我正在使用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意味着没有错误

我已经检查了github 上提出的问题,但似乎找不到任何明显的解决方案。

4

2 回答 2

2

注意 此规则 ( )
的评估考虑使用该规则定义的任何约束。dependenciesrequired

不管是什么"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"},
}

http://docs.python-cerberus.org/en/stable/customize.html

于 2019-06-21T15:33:28.177 回答
0

假设您将 csv 输入转换为文档列表,您可以首先对文档进行预处理以删除col2它为空的字段:

for document in documents:
    if not document["col2"]:
        document.pop("col2")

然后这个模式就可以完成这项工作:

{"col1": {
    "oneof": [
        {"empty": True},
        {"empty": False, "dependencies": "col2"}
    ]
}}

请注意,dependenciesandrequired规则不考虑字段的值,而只考虑文档中字段的存在。

于 2019-06-24T10:32:09.257 回答