pyparamvalidate 需求背景和说明

简介: pyparamvalidate 需求背景和说明

一、前置说明


1、本节目标

  • pyparamvalidate 需求背景和说明。

2、相关回顾


二、主要内容


1、需求背景

在编写 easyuiautotest自动化测试框架时,经常需要对用户输入的数据进行校验,并给出错误提示。


下面是一段典型的问题代码:

def example_function(name, age, gender='male', **kwargs):
    # 校验代码
    if not name:
        raise ValueError('name is required')
    if not age:
        raise ValueError('age is required')
    if gender not in ['male', 'female']:
        raise ValueError("gender must be either 'male' or 'female'")
    profile = kwargs.get("profile")
    if profile is None:
        raise ValueError('profile is required')
    address = profile.get("address")
    if not address:
        raise ValueError("address is required")
    # 业务代码
    print(name, age, gender, profile)


它的问题是:大量的校验代码与业务代码混在一起,整体显得很杂乱冗余。

所以需要对它进行改造:将普遍的校验行为抽离出来模块化,最小化对业务代码的侵入。


下面是期望的改造效果:

@ParamValidator("profile").is_similar_dict(reference_dict={"address": "", "others": {}})
@ParamValidator("gender", "gender must be either 'male' or 'female'").is_allowed("male", "female")
@ParamValidator("age", "age must be integer.").is_integer().is_not_empty()
@ParamValidator("name", "name must be string.").is_string().is_not_empty()
def example_function(name, age, gender='male', **kwargs):
    address = kwargs.get("profile").get("address")
    Validator(address).is_not_empty('address is required')
    # 业务代码
    print(name, age, gender, profile)


2、需求说明

从以上问题与期望中,提炼出需求如下:


  • 支持对函数参数进行校验,如:
@ParamValidator("name", "name must be string.").is_string().is_not_empty()
def example_function(name, age, gender='male', **kwargs):
    ...


  • 支持对一般数据进行校验,如:
address = kwargs.get("profile").get("address")
Validator(address).is_not_empty('address is required')


  • 提供清晰的错误提示,在字段规则描述或在校验方法中给出错误提示,如:
Validator(address, rule_des='address is required').is_not_empty()
Validator(address).is_not_empty('address is required')


  • 支持链式调用,方便用户连续调用多个校验方法,如:
Validator(address).is_string().is_not_empty()


  • 支持用户自定义校验规则,如:
def is_even_number(value):
    return value % 2 == 0
Validator(input).custom_validator(is_even_number, "Value must be an even number")


3、轮子调研

不重复造轮子,确定需求之后,使用 Chatgpt 做了一个简单的调研,发现有几个强大的校验数据结构的库:


暂未发现对函数进行参数校验的现成项目(可能调研不全面),于是决定: do it now .

从特性出发,因此将项目命名为:pyparamvalidate .


三、后置说明


1、要点小结

  • 数据校验是一个普遍行为,可以将其模块化;
  • do it now ,立即行动,开始实施;


2、下节准备

  • Validator 类的简单实现

点击进入《Python装饰器从入门到进阶》总目录

目录
相关文章
|
1天前
|
计算机视觉 开发者 Python
如何使用 Python 代码的 PIL 库读取和设置图像的像素内容
如何使用 Python 代码的 PIL 库读取和设置图像的像素内容
59 0
|
1天前
|
数据可视化 Python
python数据可视化 - matplotlib专题:带数据标签的双batch的Bar图绘制示例
python数据可视化 - matplotlib专题:带数据标签的双batch的Bar图绘制示例
40 0
浅析Qt Designer设置界面背景-运用PyCharm中把pyrcc5将.qrc转换为.py存在的一些问题
浅析Qt Designer设置界面背景-运用PyCharm中把pyrcc5将.qrc转换为.py存在的一些问题
浅析Qt Designer设置界面背景-运用PyCharm中把pyrcc5将.qrc转换为.py存在的一些问题
|
1天前
|
数据采集 机器学习/深度学习 开发工具
画【Python折线图】的一百个学习报告(三、设置全局 Label 颜色)
画【Python折线图】的一百个学习报告(三、设置全局 Label 颜色)
33 0
|
10月前
|
程序员 开发者 Python
#PY小贴士# py2 和 py3 的差别到底有多大?
虽然结论已经很明确,但我还是想客观地说一句:对于学习者来说,学 py2 还是 py3,真的没有太大差别。之所以这会成为一个问题
|
6月前
|
Python
Python用于解析和修改文本数据-pyparsing模块教程
Python用于解析和修改文本数据-pyparsing模块教程
78 0
|
9月前
|
机器学习/深度学习 开发工具 计算机视觉
舌体分割的初步展示应用——依托Streamlit搭建demo
舌体分割的初步展示应用——依托Streamlit搭建demo
141 0
|
12月前
|
存储 Python
Python PIL.Image模块:图片变更尺寸大小(宽x高)
Python PIL.Image模块:图片变更尺寸大小(宽x高)
559 0
|
Python
Python中,如何使用ImageDraw在Image上绘制粗线?
Python中,如何使用ImageDraw在Image上绘制粗线?
182 0
|
SQL 开发框架 JavaScript
【分享】Python 多缺口滑块验证demo
【分享】Python 多缺口滑块验证demo