添加 自定义校验方法,让用户自定义校验规则

目录

  • 一、前置说明
    • 1、总体目录
    • 2、相关回顾
    • 3、本节目标
  • 二、操作步骤
    • 1、项目目录
    • 2、代码实现
    • 3、测试代码
    • 4、日志输出
  • 三、后置说明
    • 1、要点小结
    • 2、下节准备

一、前置说明

1、总体目录

  • 《 pyparamvalidate 参数校验器,从编码到发布全过程》

2、相关回顾

  • 添加 常用校验方法,校验常见数据格式

3、本节目标

  • 添加 自定义校验方法,让用户自定义校验规则

二、操作步骤

1、项目目录

  • atme : @me 用于存放临时的代码片断或其它内容。
  • pyparamvalidate : 新建一个与项目名称同名的package,为了方便发布至 pypi
  • core : 用于存放核心代码。
  • tests : 用于存放测试代码。
  • utils : 用于存放一些工具类或方法。

2、代码实现

pyparamvalidate/core/validator.py


...

class Validator(metaclass=RaiseExceptionMeta):

    def __init__(self, value, field=None, rule_des=None):
        self.value = value
        self._field = field
        self._rule_des = rule_des

    def customize(self, validate_method, *args, exception_msg=None, **kwargs) -> Self:
        """
        注意事项:请参考示例 3

        示例 1:使用 lambda 函数
            '''
            Validator(4).customize(validate_method=lambda x: x % 2 == 0)
            '''

        示例 2:函数只有一个参数
            '''
            def even_number_validator(value):
                return value % 2 == 0

            Validator(4).customize(validate_method=even_number_validator)
            '''

        示例 3:如果函数有多个参数,必须将 "待校验参数" 放在第一位
            '''
            # 方法定义注意事项:如果有多个参数,必须将 "待校验参数" 放在第一位
            def even_number_validator(value, threshold):
                return value % 2 == 0 and value > threshold

            # 方法调用注意事项:第一个参数不要传值,exception_msg 必须以关键字参数传值。
            Validator(12).customize(even_number_validator, 10, exception_msg='value must be an even number and greater than 10.')
            '''
        """

        try:
            return validate_method(self.value, *args, **kwargs)
        except TypeError as e:

            raise CallValidateMethodError(
                f'''
                Note:
                
                1. Please do not send value to first argument in calling {validate_method.__name__}.
                2. You must pass the value for "exception_msg" as a "keyword argument".
                3. please refer to: 
                
                    def even_number_validator(value, threshold):
                        return value % 2 == 0 and value > threshold
                        
                    Validator(12).customize(even_number_validator, 10, exception_msg='value must be an even number and greater than 10.')
                    
                4. origin error: {e}'
                ''')

    ...

3、测试代码

pyparamvalidate/tests/test_validator.py


def test_customize_validator_01():
    Validator(4).customize(validate_method=lambda x: x % 2 == 0)

    with pytest.raises(ValueError) as exc_info:
        Validator(3).customize(validate_method=lambda x: x % 2 == 0, exception_msg='value must be an even number.')
    assert "value must be an even number." in str(exc_info.value)


def test_customize_validator_02():
    def even_number_validator(value):
        return value % 2 == 0

    Validator(4).customize(validate_method=even_number_validator)

    with pytest.raises(ValueError) as exc_info:
        Validator(3).customize(validate_method=lambda x: x % 2 == 0, exception_msg='value must be an even number.')
    assert "value must be an even number." in str(exc_info.value)


def test_customize_validator_03():
    def even_number_validator(value, threshold):
        return value % 2 == 0 and value > threshold

    Validator(12).customize(even_number_validator, 10)

    Validator(12).customize(even_number_validator, 10,
                            exception_msg='value must be an even number and greater than 10.')

    Validator(12).customize(even_number_validator, threshold=10,
                            exception_msg='value must be an even number and greater than 10.')

    with pytest.raises(ValueError) as exc_info:
        Validator(2).customize(validate_method=even_number_validator, threshold=10,
                               exception_msg='value must be an even number and greater than 10.')
    assert "value must be an even number and greater than 10." in str(exc_info.value)

    with pytest.raises(CallValidateMethodError) as exc_info:
        Validator(2).customize(even_number_validator, 2, 10,
                               exception_msg='value must be an even number and greater than 10.')

...

4、日志输出

执行 test 的日志如下,验证通过:

test_validator.py::test_customize_validator_01 PASSED                    [  3%]
test_validator.py::test_customize_validator_02 PASSED                    [  7%]
test_validator.py::test_customize_validator_03 PASSED                    [ 11%]

三、后置说明

1、要点小结

  • 自定义校验方法的定义和调用注意事项,见 customize 方法中的示例说明。
  • customize 方法,复制粘贴至 ParameterValidator 类中并对方法注释进行适当修改,方便 Pycharm 智能提示。

	...
	
    def customize(self, validate_method, *args, exception_msg=None, **kwargs) -> Self:
        """
        注意事项:请参考示例 3

        示例 1:使用 lambda 函数
            '''
            @ParameterValidator("param").customize(lambda x: x % 2 == 0, exception_msg="Value must be an even number")
            def example_function(param):
                return param
            '''

        示例 2:函数只有一个参数
            '''
            def even_number_validator(value):
                return value % 2 == 0

            @ParameterValidator("param").customize(even_number_validator, exception_msg="Value must be an even number")
            def example_function(param):
                return param
            '''

        示例 3:如果函数有多个参数,必须将 "待校验参数" 放在第一位
            '''
            # 方法定义注意事项:如果有多个参数,必须将 "待校验参数" 放在第一位
            def even_number_validator(value, threshold):
                
                return value % 2 == 0 and value > threshold

            # 方法调用注意事项:第一个参数不要传值,exception_msg 必须以关键字参数传值。
            @ParameterValidator("param").customize(even_number_validator, 10, exception_msg="Value must be an even number")
            def example_function(param):
                return param
            '''
        """
        ...

	...

2、下节准备

  • 使用 schema 库,自定义复杂的校验方法

点击返回主目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/327457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师4--寻址方式

软件设计师4--寻址方式 考点1:指令的基本概念考点2:寻址方式例题: 考点1:指令的基本概念 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下: 操作码字段地址码…

SpringCloud全链路灰度发布

日升时奋斗,日落时自省 目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 1、实现框架 Spring Cloud全链路灰色发布实现构架: 灰度发布的具体实现…

【C++ Primer Plus】2.1 进入C++

代码示例 #include <iostream> // a preprocessor directive 预处理器指令 int main () // function header { // start of function bodyusing namespace std; // make definitions visiblecout << "hello!"; // message…

动态路由综合实验-RIP

一.要求 1、R1--R3地址为192.168.1.0/24:请合理分配 2、R3的环回为3.3.3.0/24&#xff0c;该网段不能在rip中宣告 3、整个网络使用RIPV2&#xff0c;全网可达&#xff0c;路由表汇总&#xff0c;防止环路&#xff0c;保障更新安全&#xff0c;加快收敛速度 网络拓扑结构&…

服务器感染了.DevicData-P-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已成为网络安全威胁的一个严峻问题。其中&#xff0c;.DevicData-P-XXXXXXXX 勒索病毒以其恶意加密文件的手段引起了广泛关注。本文将介绍该病毒的特点、数据恢复方法以及如何预防遭受其攻击。 如不幸感染这个勒索病毒&…

workflow源码解析:ThreadTask

1、使用程序&#xff0c;一个简单的加法运算程序 #include <iostream> #include <workflow/WFTaskFactory.h> #include <errno.h>// 直接定义thread_task三要素 // 一个典型的后端程序由三个部分组成&#xff0c;并且完全独立开发。即&#xff1a;程序协议算…

【机器学习入门】机器学习基础概念与原理

*&#xff08;本篇文章旨在帮助新手了解机器学习的基础概念和原理&#xff0c;不深入讨论算法及核心公式&#xff09; 目录 一、机器学习概念 1、什么是机器学习&#xff1f; 2、常见机器学习算法和模型 3、使用Python编程语言进行机器学习实践 4、机器学习的应用领域 二…

Dokerfile

阅读目录 什么是dockerfile?Dockerfile的基本结构Dockerfile文件说明 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映…

Android studio RecyclerView 应用设计

一、创建empty activity项目: 二、打开activity_main.xml布局文件: 添加RecyclerView控件 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/…

Spring Boot - Application Events 同步 VS 异步 发布订阅事件实战

文章目录 PreCode基础工程启动类切入口事件 发布事件同步 Listener异步Listener增加EnableAsync增加 Async 测试 Pre Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEv…

手机与电脑更改IP地址怎么使用代理IP?

在现代互联网时代&#xff0c;代理IP已成为许多人日常生活和工作中不可或缺的一部分。通过代理IP&#xff0c;用户可以隐藏自己的真实IP地址&#xff0c;并获得更好的网络体验。本文将详细介绍如何在手机和电脑上更改IP地址并使用代理IP。 一、手机使用代理IP 1. 打开手机设置&…

目标检测DETR:End-to-End Object Detection with Transformers

NMS 对一个目标生成了多个检测窗口&#xff0c;但是事实上这些窗口中大部分内容都是重复的&#xff0c;找到目标检测最优的窗口 选取多个检测窗口中分数最高的窗口&#xff0c;剔除掉其他同类型的窗口 anchor generator 首先在该点生成scale512, aspect ratio{1:2&#xff…

第10章 通信业务

文章目录 10.1.1 通信行业1、通信行业的界定2、通信行业的特点 10.1.2 通信企业10.1.3 通信终端1、通信终端的分类2、终端发展趋势 10.2.1 通信业务的定义及分类10.2.2 基础电信业务1、第一类基础电信业务A11 固定通信业务A12 蜂窝移动通信业务A13 第一类卫星通信业务A14 第一类…

uni-app购物车页面详细代码

效果图&#xff1a; 这里的购物车加减用的是uni-app中的sku插件 代码附下&#xff08;全&#xff09;&#xff1a; <script setup lang"ts"> import {reqMemberCartList,reqMemberdelentCart,reqMemberPutCart,putMemberCartSelectedAPI, } from /services/…

go语言初探(一)

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

解决com.alibaba.fastjson.JSONException: default constructor not found的问题

1.问题描述 在进行JSON和对象互转时&#xff0c;发现有个报错&#xff1a; com.alibaba.fastjson.JSONException: default constructor not found. class com.hellobike.ph.match.service.taxi.model.message.DelayAddSkuMsg 2.原因和解决方案 通过其提示可以看出在利用fastJ…

【RTOS】快速体验FreeRTOS所有常用API(7)任务通知

目录 七、任务通知7.1 基本概念7.2 发出通知7.3 等待通知7.4 实例 七、任务通知 该部分在上份代码基础上修改得来&#xff0c;代码下载链接&#xff1a; https://wwzr.lanzout.com/i4Efu1la39wh 密码:cbvx 该代码尽量做到最简&#xff0c;不添加多余的、不规范的代码。 内容主要…

白码ERP快速实现库存不足时自动生成采购单功能

创建生产订单时&#xff0c;系统自动根据产品所需物料库存是否充足&#xff0c;如有物料库存不足&#xff0c;自动生成对应的采购订单&#xff1b; 前期准备&#xff1a; 需创建产品、物料、BOM、生产订单、生产订单明细、需求物料、采购订单、采购订单明细数据表&#xff0c…

如何查看centos7中dataease的安装位置

在 CentOS 7 中查找 DataEase 的安装位置&#xff0c;可以通过以下步骤进行&#xff1a; 检查服务状态&#xff1a; 如果 DataEase 作为服务运行&#xff0c;您可以使用 systemctl 命令来查看服务的状态&#xff0c;这通常会显示相关的路径信息。例如&#xff1a; systemctl st…

开发企业微信中的内嵌h5时如何开发与调试

前言&#xff1a; 在我们的项目中&#xff0c;开发企业微信内部的项目的话&#xff0c;分为两种&#xff0c;1种是直接开发企业微信的小程序&#xff0c;另一种则是企业微信内嵌我们的H5界面&#xff0c;我们这里讲一讲企业微信内嵌h5的方法与注意点。 1、开发h5项目 这点没有…