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

news2024/11/16 19:48:22

目录

  • 一、前置说明
    • 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.coloradmin.cn/o/1377659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式微服务专题】SpringSecurity OAuth2快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、OAuth2 介绍1.1 使用场景*1.2 基本概念(角色)1.3 优缺点 二、OAuth2的设计思路2.1 客户端授权模式2.1.0 基本参数说明2.1.1 授权码模式2.1.2 简化(隐式)模式2.1.3 密码模式2.1.4 客…

Jmerer之FTP测试

1、文件上传下载测试,可以使用sample:FTP请求,当然也可以使用HTTP Request采样器中的File Upload向服务器上传文件 2、本章重点介绍FTP请求进行文件的上传下载测试,添加 FTP请求,界面主要配置如下: Server Name or I…

程序员如何写高水平简历?(附模板)

Q:什么是高水平的简历? A:满足HR需求的同时,最大化的体现自身价值的简历是高水平的简历 HR的需求是什么? ✅ HR想看到清晰专业的简历模板 ——家人们每天看几百份简历谁懂啊!花里胡哨真看不下去一点&…

软件测试当中的测试用例模板

测试用例这块知识、经验,小酋在前面陆续都讲完了。这章提供几种用例模板,作为这块知识的收尾。 - 1 - 测试用例(主指功能测试用例模板)的内容通常包括测试目标(目的),需求标示(一般…

Open CV 图像处理基础:(四)使用 Open CV 在 Java 中进行基本的图片模糊处理

使用 Open CV 在 Java 中进行基本的图片模糊处理 目录 使用 Open CV 在 Java 中进行基本的图片模糊处理方法介绍均值模糊(Averaging Blur):高斯模糊(Gaussian Blur):中值模糊(Median Blur):双边滤波&#x…

软件测试工程师如何对算法做测试?

最近几年,随着大数据、人工智能等领域的快速发展,算法受到前所未有的重视,算法测试也随之兴起。 为了让大家能对算法测试有个初步的了解,这篇文章将对“如何做算法测试”进行梳理,大纲如下: 1、算法测试测…

C++20:从0到1学懂concept

目录 1.concept语法 1.1 替换typename1.2 requires关键字1.4 concept与auto2.编译器支持3.总结 C20引入了concept(概念),是对模板参数(编译时评估)的一组约束。你可以将它们用于类模板和函数模板来控制函数重载和特化。一些优点包括: 对模版参数强制类型…

Mac 下载 nvm 后执行nvm -v 命令报错 nvm: command not found

1、问题:Mac 使用命令下载nvm 成功后执行 nvm -v 查看,报错:nvm command not found 2、原因:可能是系统更新后,默认的 shell 是 zsh,所以找不到配置文件 3、解决:可添加编辑.bash_profile 和 …

(1)(1.13) SiK无线电高级配置(六)

文章目录 前言 15 使用FTDI转USB调试线配置SiK无线电设备 16 强制启动加载程序模式 17 名词解释 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 15 使用FTDI转USB调试线配置SiK无线…

如何在 SwiftUI 中实现音频图表

文章目录 前言DataPoint 结构体BarChartView 结构体ContentView 结构体实现协议实现线图总结 前言 在可访问性方面,图表是复杂的事物之一。iOS 15 引入了一项名为“音频图表”的新功能。 下面我们将学习如何通过使用 accessibilityChartDescriptor 视图修饰符为任…

代码随想录第第五十七天—回文子串,最长回文子序列

leetcode 647. 回文子串 题目链接:回文子串 版本一:动态规划 dp数组及下标的含义 dp[i][j]:区间范围[i, j] (左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。确定递推公式…

C语言用函数指针实现计算器

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现目录函数&#xff1b; void menum() {//打印目录&#xff1b;printf("***********************************************\n");printf("***…

什么是数通技术?以太网交换机在数通技术中的精要

什么是数通技术&#xff1f; 数通技术是指数字通信技术&#xff0c;它涵盖了数字信号处理、数据传输、网络通信等领域。通信工程师在数通技术中负责设计、建设和维护数字通信系统&#xff0c;以实现可靠、高效的信息传输。这涉及到数字信号的编解码、调制解调、数据压缩、网络…

【架构专题】我为什么要写Spring Cloud Alibaba微服务架构实战派上下册这本书?

在写这本书之前&#xff0c;我先后在两家杭州的“独角兽”公司担任技术负责人&#xff0c;并推进公司核心业务的“中台化”改造。在落地业务中台和技术中台的过程中&#xff0c;督促并指导开发人员统一使用Spring Cloud Alibaba作为中台服务最底层的基础框架。为了快速推进业务…

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载)

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载) 什么是自然语言处理 (NLP) ? 自然语言处理 (NLP) 是计算机科学的一个分支,更具体地说,是人工智能 (AI) 的分支,旨在让计算机能够以与人类大致相同的方式理解文本和语音。 自然语…

JavaEE学习笔记 2024-1-12 --Tomcat服务器、Servlet

JavaEE JavaEE是企业级开发 是综合性非常强的阶段  包含的知识点:JavaSE,MySQL,JDBC,WEB(HTML,CSS,JS,前端框架),Servlet,JSP,XML,AJAX等技术 1.服务器 JavaEE项目需要运行在服务器之上 WEB服务器就是WEB项目的容器,WEB项目的运行环境,将项目部署到服务器下,可以通过服务器…

[JVM] Java类的加载过程

Java类的加载过程 在Java中&#xff0c;类的加载是指在程序运行时将类的二进制数据加载到内存中&#xff0c;并转化为可以被JVM执行的形式的过程。类的加载过程主要包括以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;通过类的全限定名&#xff0c;…

redis — redis cluster集群模式下如何实现批量可重入锁?

一、redis cluster 集群版 在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,当 Redis 在集群模式下运行时,它处理数据存储的方式与作为单个实例运行时不同。这是因为它应该准备好跨多个节点分发数据,从而实现水平可扩展性。具体能…

vue前端开发自学,子组件传递数据给父组件,使用$emit

vue前端开发自学,子组件传递数据给父组件,使用$emit 父子组件之间互相传递数据的情况非常常见&#xff0c;下面为大家介绍的是&#xff0c;来自子组件&#xff0c;给父组件传递数据的情况。 <template><h3>组件事件demo</h3><Child someEvent"getI…

Vue-13、Vue绑定css样式

1、绑定css样式字符串写法&#xff0c;适用于&#xff1a;样式的类名不确定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>绑定css样式</title><!--引入vue--><script type"tex…