首页 > 编程问答 >在 pydantic 模型中包含非验证方法是一种不好的做法吗?

在 pydantic 模型中包含非验证方法是一种不好的做法吗?

时间:2024-07-20 20:48:44浏览次数:12  
标签:python validation design-patterns model pydantic

我正在使用 pydantic 1.3 来验证我正在编写的 API 的模型。

在继承自 pydantic.BaseModel 的类中包含任意方法是否常见/良好实践?

我需要一些与对象,我正在尝试决定是否需要一个“处理程序”类。这些模型正在转换为 JSON 并发送到我也在编写的一个宁静的服务。

我的模型看起来像这样:

class Foo(pydantic.BaseModel):
    name: str
    bar: int
    baz: int

这样做是不是不好的做法:

class Foo(pydantic.BaseModel):
    name: str
    bar: int
    baz: int

    def add_one(self):
        self.bar += 1

这对我来说有些道理,但我找不到任何人这样做的例子。


在 Pydantic 模型中包含非验证方法 并非天生就是坏事 ,但这 通常表明你的模型承担了过多的责任,可能需要重新设计

为什么在 Pydantic 模型中使用非验证方法可能不合适?

  • 关注点分离: Pydantic 模型主要用于数据验证和序列化。将其他业务逻辑添加到其中会模糊其主要目的,并可能导致难以测试和维护的臃肿模型。
  • 意外副作用: 在验证上下文中调用非验证方法可能会导致意外的副作用,特别是在你希望 Pydantic 处理数据完整性的情况下。
  • 替代方案: 通常,可以使用更清晰、更易于测试的模式来实现相同的结果,例如使用单独的函数或服务类来处理业务逻辑。

何时在 Pydantic 模型中使用非验证方法可能是可以接受的?

  • 派生属性: 如果某个方法计算基于模型属性的派生值而没有副作用,那么将其包含在模型中可能是合理的。
  • 格式化辅助函数: 用于特定格式(例如,用于 API 响应的自定义 JSON 表示形式)准备数据的简单帮助器方法有时可以放在模型中,以提高便利性。

关于你的具体示例

add_one 方法修改模型的状态。这最好作为模型外部的单独函数或方法来处理。例如:

def add_one_to_bar(foo: Foo) -> Foo:
  """将 foo.bar 增加 1 并返回更新后的 Foo 实例。"""
  return foo.copy(update={"bar": foo.bar + 1})

# ... 后续代码 ...
foo = Foo(name="MyFoo", bar=2, baz=5)
updated_foo = add_one_to_bar(foo)

此方法将业务逻辑与数据模型分离,从而提高了代码的可读性和可维护性。

总之

虽然在 Pydantic 模型中包含非验证方法并非严格禁止,但在这样做之前,请仔细考虑你的设计选择。通常,存在更清晰、更易于维护的替代方案可以更好地分离关注点并防止意外的副作用。如果选择在模型中包含非验证方法,请确保它们服务于明确的目的并且不会引入不必要的复杂性。

标签:python,validation,design-patterns,model,pydantic
From: 60047685

相关文章

  • 用于检查 Google Gemini 支持的所有 GenerativeAI 模型的 Python 代码是什么?
    作为GenerativeAI世界的新手,我正在尝试加载预先训练的文本生成模型并做一些不起作用的事情。这就是我加载GenerativeAI模型的方式。fromvertexai.generative_modelsimportGenerativeModelgeneration_model=GenerativeModel("gemini-pro")由于它不......
  • 想让字典操作更优雅?自定义Python字典类型,简化你的代码库!
    目录1、继承dict类......
  • Vispy,一个专门用于创建交互式可视化的python库
    目录什么是Vispy?为什么选择Vispy?安装Vispy基础概念创建第一个Vispy可视化2D图形的进阶使用3D图形的绘制交互性结论什么是Vispy?Vispy是一个高性能的Python库,专门用于创建交互式可视化。它支持2D和3D数据的可视化,并且可以轻松地集成到各种应用程序中。Vispy的核心优......
  • python 复制 excel 保留文档中完全相同的参数(样式、单元格大小和融合、边框...)
    我正在寻找一种在其他文件中复制和excel的方法。我有一个“file_1.xlsx”,但我想要一个不存在的“file_1_copy.xlsx”。副本必须与原始文件完全相同,这意味着单元格大小、它们的融合、单元格中文本的颜色、背景、如果有边框,就好像我用右键单击。我有:importopenpyxlfromope......
  • python查看某个包的当前安装版本以及最新版本
    方法1:使用pip和--outdated参数你可以使用piplist--outdated命令来查看哪些包有更新版本可用。这个命令会列出所有安装的包以及它们在PyPI上的最新版本。piplist--outdated这将输出一个包列表,包含当前版本和最新版本,例如:PackageVersionLatestTyp......
  • 【python】错误 SyntaxError: invalid syntax的解决方法总结
    【python】错误SyntaxError:invalidsyntax的解决方法总结在Python编程中,SyntaxError:invalidsyntax是一个常见的错误,通常表示Python解释器在尝试解析代码时遇到了语法错误。这种错误可能由多种原因引起,包括拼写错误、缺少关键字、不恰当的缩进等。本文将深入探讨......
  • MiniQMT国债逆回购策略Python代码全解析
    文章目录......
  • python—爬虫的初步了解
    Python爬虫(WebScraping)是一种自动化从网站上提取数据的技术。Python由于其简洁的语法、丰富的库和强大的社区支持,成为了实现网络爬虫的首选语言之一。下面是一些Python爬虫的基本概念和步骤:1.爬虫的基本概念请求(Request):爬虫向服务器发送的请求,通常包括URL、HTTP方法(如......
  • Python集合的概念与使用
      在Python中,集合(set)是一种无序且不包含重复元素的数据结构。集合对象由一组大括号 或 函数创建,但请注意,大括号 在没有元素的情况下会创建一个空字典,而不是空集合。因此,当你想创建一个空集合时,应该使用 set()函数而不是 set{}集合的特点无序:集合中的元素没有特定的......
  • python——面向对象(2)继承与多态
    文章目录继承的基本语法继承的特点继承的类型多态在Python中,继承是一种基于已存在的类来创建新类的方式。这种机制允许我们定义一个通用的类,然后基于这个类来定义一些特定的类,这些特定的类将继承通用类的属性和方法,同时也可以添加或覆盖一些新的属性和方法。这种方式......