You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pydantic主配置类中加载嵌套配置的环境变量?

问题原因

你手动实例化SubSettings()时未传入_env_file参数,导致这个嵌套实例不会读取指定的local.env文件,仅会读取系统环境变量。主Settings实例加载的环境变量不会自动传递给手动创建的嵌套BaseSettings实例,这就是sub_field无法加载的核心原因。

解决方法

方法1:初始化嵌套类时传递相同的_env_file

直接在Settings类中给sub_settings的默认实例传入环境文件参数:

from typing import Optional
from pydantic import BaseSettings, Field

class SubSettings(BaseSettings):
    sub_field: Optional[str] = Field(None, env='SUB_FIELD')

class Settings(BaseSettings):
    field_one: Optional[str] = Field(None, env='FIELD_ONE')
    field_two: Optional[int] = Field(None, env='FIELD_TWO')
    # 手动实例化时传入环境文件路径
    sub_settings: SubSettings = SubSettings(_env_file='local.env')

settings = Settings()

注意:这种方式会硬编码环境文件路径,动态切换环境时不够灵活。

方法2:主类初始化时动态传递环境配置

重写Settings的__init__方法,将主类使用的环境文件参数同步传递给嵌套的SubSettings:

from typing import Optional
from pydantic import BaseSettings, Field

class SubSettings(BaseSettings):
    sub_field: Optional[str] = Field(None, env='SUB_FIELD')

class Settings(BaseSettings):
    field_one: Optional[str] = Field(None, env='FIELD_ONE')
    field_two: Optional[int] = Field(None, env='FIELD_TWO')
    sub_settings: SubSettings

    def __init__(self, _env_file=None, _env_file_encoding=None, **kwargs):
        super().__init__(_env_file=_env_file, _env_file_encoding=_env_file_encoding, **kwargs)
        # 同步主类的环境文件配置
        self.sub_settings = SubSettings(
            _env_file=_env_file,
            _env_file_encoding=_env_file_encoding
        )

# 动态传入环境文件名
settings = Settings(_env_file='local.env')

方法3:让Pydantic自动解析嵌套配置(推荐)

去掉sub_settings的手动实例化,仅声明类型,让Pydantic自动处理嵌套结构,同时确保环境配置能被嵌套类读取:

from typing import Optional
from pydantic import BaseSettings, Field

class SubSettings(BaseSettings):
    sub_field: Optional[str] = Field(None, env='SUB_FIELD')

class Settings(BaseSettings):
    field_one: Optional[str] = Field(None, env='FIELD_ONE')
    field_two: Optional[int] = Field(None, env='FIELD_TWO')
    # 仅声明类型,不手动实例化
    sub_settings: SubSettings

# 初始化时传入环境文件,Pydantic自动解析所有字段(包括嵌套的sub_settings)
settings = Settings(_env_file='local.env')

如果环境文件路径固定,也可以在Settings的Config类中统一指定:

class Settings(BaseSettings):
    # ... 字段定义 ...
    class Config:
        env_file = 'local.env'

settings = Settings()

这种方式下,Pydantic会自动将local.env中的SUB_FIELD映射到sub_settings.sub_field。

内容的提问来源于stack exchange,提问作者stormakt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:52:37