phonenumbers 与 国内电话号码校验
1、phonenumbers的使用
在Python中,phonenumbers 库是一个非常流行的库,用于解析、格式化、存储和验证国际电话号码。而 pydantic 是一个数据解析和验证库,它基于Python类型提示,使得数据验证变得简单且类型安全。将 phonenumbers 与 pydantic 结合使用,可以在模型验证中包括电话号码的验证。
下面是如何在 pydantic 模型中使用 phonenumbers 来验证电话号码的一个示例。
首先,你需要安装必要的库(如果你还没有安装它们的话):
1 | pip install phonenumbers pydantic |
然后,可以创建一个自定义的验证器,该验证器使用 phonenumbers 来检查电话号码是否有效,并将其集成到 pydantic 模型中。
1 | from typing import Optional |
在这个例子中,PhoneNumber 类是一个 pydantic 模型,它接受一个 raw_input 字段作为电话号码的原始输入。使用 @validator 装饰器,我们定义了一个预处理验证器 validate_phone_number,它使用 phonenumbers.parse 来解析电话号码,并检查其是否有效。如果电话号码有效,则根据 phonenumbers 提供的格式函数生成并存储 e164、international 和 national 格式的电话号码。
注意,由于 @validator 装饰器上的 pre=True 参数,该验证器会在字段值被赋值到模型实例之前运行。此外,验证器函数本身不直接返回要赋给字段的值(因为我们在类级别上设置了其他字段),而是返回原始输入值 v,以便它可以被正常处理并赋值给 raw_input 字段。
最后,我们尝试实例化 PhoneNumber 模型并传入一个有效的电话号码,然后打印出模型的JSON表示。如果传入无效的电话号码,则会捕获并打印出 ValidationError 异常。
2、在 Pydantic 模型中使用PhoneNumber
pydantic_extra_types 是一个扩展 pydantic 的类型系统的开发包,包括添加对特定数据类型(如电话号码)的支持。在使用前,需要安装:
1 | pip install pydantic phonenumbers pydantic_extra_types |
完成安装后,既可以在模型中定义PhoneNumber类型的字段。
1 | from pydantic import BaseModel |
3、定义一个国内电话号码的PhoneNumber
1 | class ChinesePhoneNumber(PhoneNumber): |
