我正在编写一个 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