Pydantic升级至2.6后.env文件列表配置失效问题求助
解决Pydantic 2.6中.env列表配置解析失败的问题
Pydantic从1.x升级到2.x后,BaseSettings迁移到了pydantic_settings包,同时默认的环境变量解析行为发生变化——不再自动将JSON格式的字符串解析为列表等复杂类型,这就是你遇到报错的原因。以下两种方法可恢复原有解析行为:
方法一:改用逗号分隔的.env配置(推荐)
修改.env文件中的列表格式为逗号分隔:
MY_LIST=a,b
然后在代码中给字段添加env_delimiter参数,指定用逗号分割列表元素:
from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import Field import os import logging import sys class Settings(BaseSettings): my_list: list[str] = Field(..., env="MY_LIST", env_delimiter=",") model_config = SettingsConfigDict( env_file=f'{os.environ.get("ENV")}.env', env_file_encoding='utf-8', env_prefix=f'{os.environ.get("ENV")}_', extra='ignore' ) try: settings = Settings() print(settings) except Exception as e: logging.critical(f"required settings not provided, shutting down - {e}") sys.exit(1)
方法二:保留JSON格式的.env配置
如果需要继续使用MY_LIST=["a","b"]这种JSON格式的配置,可以用pydantic.Json类型定义字段,让Pydantic自动解析JSON字符串:
from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import Field, Json import os import logging import sys class Settings(BaseSettings): my_list: Json[list[str]] = Field(..., env="MY_LIST") model_config = SettingsConfigDict( env_file=f'{os.environ.get("ENV")}.env', env_file_encoding='utf-8', env_prefix=f'{os.environ.get("ENV")}_', extra='ignore' ) try: settings = Settings() print(settings) except Exception as e: logging.critical(f"required settings not provided, shutting down - {e}") sys.exit(1)
注意:Pydantic 2.x中原Config类已被model_config替代,需用SettingsConfigDict配置环境文件等参数。
内容的提问来源于stack exchange,提问作者Peter Sampson
相关产品推荐
相关产品推荐

