首页 > 编程问答 >pydantic_settings 没有正确调用“之前”验证器

pydantic_settings 没有正确调用“之前”验证器

时间:2024-08-01 04:16:33浏览次数:12  
标签:python pydantic pydantic-settings

我正在编写一个 pydantic_settings 类来从 .env 文件/环境变量中读取数据。相关部分如下所示:

from pydantic_settings import BaseSettings
from pydantic import Field, field_validator
from typing import Tuple

class JobSettings(BaseSettings):
    wp_generate_funnel_box: bool = Field(True)
    wp_funnel_box_dims_mm: Tuple[int, int, int] = Field((380, 90, 380))

    @field_validator('wp_funnel_box_dims_mm', mode='before')
    @classmethod
    def parse_int_tuple(cls, v) -> tuple[int, int, int]:
        output = tuple(int(x.strip()) for x in v.split(','))
        assert len(output) == 3
        return output

    model_config = {
        "env_file": ".env",
        "env_file_encoding": "utf-8",
        "extra": "ignore",
    }

我需要从环境变量中的字符串创建一个整数的三元组:

wp_generate_funnel_box="True"
wp_funnel_box_dims_mm="380, 90, 380"

Pydantic 似乎没有针对此数据类型的本机解析器,因此我实现了此字段验证器正确解析和验证数据。然而,Pydantic 似乎并没有运行该方法中的代码; print 语句不会产生任何输出,并且简单地返回 tuple(1, 2, 3) 也不会执行任何操作。我认为我误解了 Pydantic 如何处理字段、验证器和排序。引发的具体错误是:

SettingsError: error parsing value for field "wp_funnel_box_dims_mm" from source "DotEnvSettingsSource"

我尝试了装饰器、模式和逻辑结构的各种配置。到目前为止,生成的错误类型没有任何改变。 Pydantic 不会在其内部逻辑之前运行验证器。


问题在于你正在使用 field_validator 装饰器,但将其应用于 'before' 模式。在 'before' 模式下,Pydantic 期望一个验证函数,而不是解析函数。

为了解决这个问题,你需要使用 from_string 参数直接在 Field 定义中解析字符串:

from pydantic_settings import BaseSettings
from pydantic import Field
from typing import Tuple

class JobSettings(BaseSettings):
    wp_generate_funnel_box: bool = Field(True)
    wp_funnel_box_dims_mm: Tuple[int, int, int] = Field(
        (380, 90, 380), 
        from_string=lambda v: tuple(int(x.strip()) for x in v.split(","))
    )

    model_config = {
        "env_file": ".env",
        "env_file_encoding": "utf-8",
        "extra": "ignore",
    }

这段代码直接在 Field 定义中使用 from_string 参数来解析字符串。它使用与你的 parse_int_tuple 函数相同的逻辑,将字符串转换为整数元组。

通过这种方法,你不再需要 field_validator 装饰器,因为解析是在 Field 定义本身中处理的。

这应该可以解决你的问题,并允许 Pydantic 正确解析来自环境变量的字符串。

标签:python,pydantic,pydantic-settings
From: 78818197

相关文章

  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......
  • Python爬虫入门03:用Urllib假装我们是浏览器
    文章目录引言Urllib库简介Request模块详解Error模块与异常处理Parse模块与URL解析Robotparser模块模拟浏览器请求使用Request方法添加请求头信息代码示例1.设置请求URL和请求头2.定义请求参数并转换为适当的格式3.使用Request方法封装请求4.发送请求并获取响应常用......
  • 请以零基础学Python 之 第二十讲 分组和贪婪匹配
    当我们处理字符串时,有时候需要根据特定的模式来分割或者提取信息。Python提供了强大的正则表达式库re,可以帮助我们实现这些复杂的字符串操作。本篇博客将介绍两个常用的正则表达式技巧:分组和贪婪匹配。分组(Grouping)在正则表达式中,分组是将多个模式单元组合为一个单元,以便......
  • 零基础学python 之 第十九讲 正则表达式
    当你开始学习Python编程时,正则表达式是一项非常强大的工具,用于处理文本数据中的模式匹配和搜索。本篇博客将带你从零开始学习如何在Python中使用正则表达式。1.什么是正则表达式?正则表达式(RegularExpression)是用于描述字符串模式的一种工具,可以用来匹配、查找、替换符合特......
  • python之贪吃蛇
    废话不多说,直接上代码(确保已经安装pygame)importpygameimportrandom#基础设置#屏幕高度SCREEN_HEIGHT=480#屏幕宽度SCREEN_WIDTH=600#小方格大小GRID_SIZE=20#颜色设置WHITE=(255,255,255)BLACK=(0,0,0)GREEN=(0,255,0)#初始化Pyg......
  • Python - Context Managers
    withstatementHereisthesyntaxofthewithstatement:withexpressionasvar:statementsTheexpressionshouldbeacontextmanagerobject,oritshouldproduceacontextmanagerobject.Whenthiswithstatementisexecuted,thefirstthingthat......
  • python装饰器
    一前言环境:win10python3.10二函数中的函数如果定义了一个函数A,现在想在不影响函数A原先功能的情况下,新增加一些额外的功能,怎么办,下面是一个例子如上,本来原先执行test_except那句话只会打印over那句话,但现在执行test_except却会输出一些另外的东西这其中有个巧妙地东西就......