首页 > 编程问答 >Pydantic constr 与 Field args

Pydantic constr 与 Field args

时间:2024-07-30 13:29:15浏览次数:7  
标签:python fastapi python-typing pydantic

我想知道:

from pydantic import BaseModel, Field

class Person(BaseModel):
    name: str = Field(..., min_length=1)

和:

from pydantic import BaseModel, constr

class Person(BaseModel):
    name: constr(min_length=1)

两者似乎都执行相同的验证(甚至在 name 为空字符串时引发完全相同的异常信息)。这只是代码风格的问题吗?其中之一优于另一个吗?

另外,如果我想包含非空字符串列表作为属性,您认为以下哪种方式更好?:

from typing import List
from pydantic import BaseModel, constr

class Person(BaseModel):
    languages: List[constr(min_length=1)]

或者:

from typing import List    
from pydantic import BaseModel, Field

class Person(BaseModel):
    languages: List[str]
    
    @validator('languages', each_item=True)
    def check_nonempty_strings(cls, v):
        if not v:
            raise ValueError('Empty string is not a valid language.')
        return v

编辑: FWIW,我将其用于 FastAPI 应用程序。

编辑2: 对于我的第二个问题,我认为第一个替代方案更好,因为它包含架构中的长度要求(因此它在文档中)


你问了一个关于在 Pydantic 中使用 Field constr 的区别的有趣问题。两者都可以用来定义字段的约束条件,但它们在适用性和最佳实践方面有所不同。

Field constr 用于基本验证

你完全正确,在你的第一个例子中, Field(..., min_length=1) constr(min_length=1) 在功能上是等效的。它们都强制执行了 name 字段不能为空字符串。

通常,建议将 constr 用于简单类型约束,因为它更简洁易读。 Field 更强大,当你需要使用 constr 不支持的其他选项(如 regex example 或自定义验证函数)时,应该使用它。

非空字符串列表的验证

对于你的第二个问题(验证非空字符串列表),第一个选项使用 List[constr(min_length=1)] 更简洁,并且在模型定义本身中表达了验证逻辑,使其更易理解和记录。

第二个选项,使用 @validator ,虽然有效,但引入了更冗长的代码,并且验证逻辑与模型定义分离。

因此,对于大多数情况,首选使用 List[constr(min_length=1)] 的方法。

关于 FastAPI 的注意事项

你提到你正在使用 FastAPI。值得注意的是,FastAPI 利用 Pydantic 进行数据验证和文档。使用 constr 或具有描述性 Field 设置将使 FastAPI 在你的 API 文档中包含这些约束,从而使客户端更容易理解你的 API 的预期数据结构。

总之:

  • 对于简单的类型约束,如 min_length ,首选 constr 以提高可读性和简洁性。
  • 当需要更复杂的验证或需要额外的 Field 特性时,请使用 Field
  • 对于非空字符串列表, List[constr(min_length=1)] 比使用 @validator 的自定义函数更简洁,更可取。

通过遵循这些指南,你可以编写出更可维护、自文档化的 Pydantic 模型来满足你的 FastAPI 应用程序的需求。

标签:python,fastapi,python-typing,pydantic
From: 70383316

相关文章

  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......
  • 如何将多个变量分配给 python 函数中的单个参数?
    我正在尝试编写一个程序,如果可能的话,它需要一个三项式并对其进行因式分解。每当用户输入A、B和C时,三项式应该通过Factor(product,summation)函数获取,但我似乎无法弄清楚如何将A和C分配给乘积arg,将B分配给我尝试在函数外部声明不同的变量,product=(a*c)和summati......
  • python - 从文本生成音乐
    请给我一些建议为了解释一下,我输入“深度睡眠的睡眠音乐”,它将返回一个wav文件:https://www.youtube.com/watch?v=1wAdQhFJy54或者我给出一个wav文件,它会返回相同的现在这是我尝试过的:https://github.com/facebookresearch/audiocraft......
  • 从零开始的Python开发日记(7):短信验证功能开发流程
    短信验证功能开发流程在开发一个包含登录、注册以及短信验证的功能时,你需要遵循一个系统的开发流程。以下是实现这一功能的基本步骤,包括所需的技术和代码示例。1.环境配置首先,确保你的开发环境已经配置好,并安装了必要的库和工具。pipinstallfastapiuvicornsqlalche......
  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......
  • 在家用电脑上设置 Python 和 Jupyter,尝试打开 Jupyter 笔记本并显示错误,无法获取
    我有最新的Python版本3.12.4和以下版本的Jupyter:SelectedJupytercorepackages...IPython:8.26.0ipykernel:6.29.5ipywidgets:notinstalledjupyter_client:8.6.2jupyter_core:5.7.2jupyter_server:2.14.2jupyterlab......
  • Python - Reloading a module
    Eachmoduleisloadedintomemoryonlyonceduringaninterpretersessionorduringaprogramrun,regardlessofthenumberoftimesitisimportedintoaprogram.Ifmultipleimportsoccur,themodule’scodewillnotbeexecutedagainandagain.Suppose......
  • vscode python 3.7 pylance debugpy 插件 vsix
    可能报错  crashed5timesinthelast3minutes.Theserverwillnotberestarted.  ---pylance 可能报错  cannotreadpropertiesofundefinedreadingresolveEnvironment   --- debugger可能      vscodepython3.7调试没有反应......
  • Python获取秒级时间戳与毫秒级时间戳的方法[通俗易懂]
    参考资料:https://cloud.tencent.com/developer/article/21581481、获取秒级时间戳与毫秒级时间戳、微秒级时间戳代码语言:javascript复制importtimeimportdatetimet=time.time()print(t)#原始时间数据print(int(t))......