不要手动做数据校验

简介: 不要手动做数据校验

不要手动做数据校验
在日常编码时,很大比例的错误处理工作和用户输入有关。当程序里的某些数据直接来自用户输入时,我们必须先校验这些输入值,再进行之后的处理,否则就会出现难以预料的错误。

举例来说,写一个命令行小程序,它要求用户输入一个0~100范围的数字。假如用户输入的内容无效,就要求其重新输入。要求用户输入数字的脚本(手动校验)。

小程序的代码如代码清单所示:

def input_a_number():
    """要求用户输入一个0~100的数字,如果无效则重新输入"""
    while 1:
        number = input('Please input a number (0-100): ')

        # 下面的三条if语句都是对输入值的校验代码
        if not number:
            print('Input can not be empty!')
            continue
        if not number.isdigit():
            print('Your input is not be a valid number!')
            continue
        if not (0 <= int(number) <= 100):
            print('Please input a number between 0 and 100!')
            continue

        number = int(number)
        break
    print(f'Your number is {number}')

input_a_number()

运行效果如下:

Please input a number (0-100): 
Input can not be empty!
Please input a number (0-100): foo
Your input is not be a valid number!
Please input a number (0-100): 65
Your number is 65

这个函数共包含14行代码,其中9行if都在校验数据。也行你觉得这样的代码结构很正常,但请想象一下,假如我们需要校验的输入不止一个,校验逻辑也比这个复杂怎么办?

如何改进这段代码呢?假如把数据校验代码抽成一个独立函数,和核心逻辑隔离开,代码肯定会变得更清晰。不过比这更重要的是,我们要把“输入数据校验”当作一个独立的领域,挑选更适合的模块来完成这项工作。

在数据校验这块,pydantic模块是一个不错的选择。如果用它来做校验,上面的代码可以改成如下形式:

**要求用户输入数字的脚步(使用pydantic库)**
from pydantic import BaseModel, conint, ValidationError

class NumberInput(BaseModel):
    number: conint(gt=0, le=100)

def input_a_number_with_pydantic():
    while 1:
        number = input('Please input a number (0-100):')
        # 实例化pydantic模型,捕获校验错误异常
        try:
            number_input = NumberInput(number=number)
        except ValidationError as e:
            print(e)
            continue

        number = number_input.number
        break
    print(f'Your number is {number}')

input_a_number_with_pydantic()

使用专业的数据校验模块后,整段代码变得简单了许多。在编写代码时,我们应当尽量避免手动校验任何数据。因为数据校验任务独立性很强,所以应该引入合适的第三方校验模块(或者自己实现),让它们来处理这部分专业工作。

相关文章
|
8月前
|
设计模式 SQL Java
如何优雅的进行入参数据校验?
在开发中,入参数据校验至关重要,涉及API接口调用、业务逻辑处理和数据库操作等场景。优雅的处理方式包括使用注解、DTO、自定义校验器、AOP、全局异常处理和第三方库。这些方法能分离校验逻辑,提升代码可读性、可维护性和复用性,同时确保性能和安全性。
|
开发框架 前端开发 网络协议
使用 DataAnnotations(数据注解)实现模型的通用数据校验
在实际项目开发中,无论任何方式、任何规模的开发模式,项目中都离不开对接入数据模型参数的合法性校验,目前普片的开发模式基本是前后端分离,当用户在前端页面中输入一些表单数据时,点击提交按钮,触发请求目标服务器的一系列后续操作,在这中间的执行过程中(标准做法推荐)无论...
43473 1
使用 DataAnnotations(数据注解)实现模型的通用数据校验
|
4月前
|
小程序
不要手动做数据校验
不要手动做数据校验
36 0
|
8月前
|
SQL API 数据库
优雅地进行入参数据校验:场景和处理方式
在日常的开发工作中,入参数据校验是确保程序健壮性的关键步骤之一,我们需要确保请求中的数据类型、格式和取值范围符合要求,以保证接口的安全性和稳定性,还有就是传递给方法或函数的数据需要满足一定的规则和要求,以保证程序的正常运行和数据的有效处理。那么本文就来分享一下在哪些场景下进行入参数据校验,并分享一些优雅的处理方式,以提高代码的可读性、扩展性和复用性。
117 3
优雅地进行入参数据校验:场景和处理方式
|
8月前
|
SQL 监控 Oracle
增量数据同步验证
增量数据同步验证
144 3
|
Java 数据库连接 开发者
计量单位及数据校验解读
计量单位及数据校验解读
|
前端开发 Java API
数据校验(前端数据校验、JSR303校验)
数据校验(前端数据校验、JSR303校验)
269 0
|
前端开发 数据安全/隐私保护 容器
8.5请求数据校验
为了提高响应速度,一般在前端界面需要进行数据校验,但是在后端也需要对数据进行校验,以防止不正常的数据传入后台。 .net内置在`System.ComponentModel.DataAnnotations`命名空间下定义了很对检验规则`Attribute`,如[Required]表示必须为非空,[EmailAddress]表示必须为邮箱格式,[RegularExpression]可以用正则对数据进行限制,但是这样模型类和检验规则耦合性很强,不推荐使用。
GoFrame数据校验之校验对象 | 校验结构体
这篇文章将会为大家介绍GoFrame数据校验中校验对象的知识点,包括:Validator对象常用方法的介绍、单数据校验、校验Map、校验结构体的示例
181 0
GoFrame数据校验之校验对象 | 校验结构体