【问题标题】:Using custom validation for built in types对内置类型使用自定义验证
【发布时间】:2020-03-25 21:17:11
【问题描述】:

我希望使用自定义验证器验证日期时间类型,而不是内置验证器。

代码如下所示:

        schema_text = """
            run_date:
                type: datetime
                required: true
            """
        s.schema = yaml.load(schema_text)

        s.validate(yaml.load("run_date: 2017-01-01T00:00+00:00:00"))

可以使用checks_with: my_custom_validator 做到这一点,这将是好的,但我希望将这些模式向公众开放,所以请他们都做出贡献对他们来说会很麻烦。我认为这也可以使用归一化器来完成,但同样,我不想对输入进行调整。

这里有什么建议吗? dateutil 解析器正是我想要使用的。

【问题讨论】:

  • 类型检查对 Python 类型维度进行操作。当你有一个结构化的字符串,它可能 mentally 是别的东西,但你需要将它解析成你想要验证的类型。如果您想检查字符串的结构,请使用正则表达式规则。
  • 我要做的是采用类型声明,并且,如果它是我认可的(例如日期时间),我会使用我想要的自定义验证器来处理它,而不是使用标准Python 类型定义。那可能吗?还是我应该定义一个新类型?
  • 你从解析出来的yaml中得到的是一个字符串,不是吗?
  • 是的 - 它来自一个字符串

标签: python-3.x cerberus


【解决方案1】:

由于您的输入数据是一个字符串,它以 ISO 8601 格式表示 datetime,因此您可以使用两种方法而无需进行任何自定义。

要么(尝试)将字符串转换为datetime.datetime 对象:

from datetime import datetime

schema = {
    "run_date": {"coerce": datetime.fromisoformat}
}

这需要通过规范化进行验证,否则会导致错误或将 run_date 字段的值转换为 datetime.datetime 对象。

如果您想坚持使用字符串作为数据类型,请使用regex 规则:

schema = {
    "run_date": {"type": "string", "regex": r"\d{4}-\d\d-\d\d-etc.pp."}
}

【讨论】:

  • 哦,我很感激 - 不幸的是,我希望能够接受来自公众的模式,并且希望得到比让他们了解强制是什么或必须执行正则表达式更简单的方法。不过,我认为这两种方法都有效 - 所以我会做复选标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
相关资源
最近更新 更多