Pydantic 使用 BaseSettings 从 .env 文件读取列表

0 投票
1 回答
28 浏览
提问于 2025-04-12 14:17

在把pydantic从1.9更新到2.6之后,我发现我在.env文件里的列表不再正常工作了。我想知道是否有新的语法或者其他设置需要开启,才能让它恢复到以前的行为。

这是我之前的设置:

`my_list: list[str]`

在.env文件中写成:

MY_LIST=["a","b"]

在1.9版本中,这样写是可以正常工作的,但现在我遇到了错误:

  Input should be a valid list [type=list_type, input_value='["a","b"]', input_type=str]
    For further information visit https://errors.pydantic.dev/2.6/v/list_type

我找不到任何方法让它不把输入当作字符串来处理。其他非列表的变量都能正常工作。

总的来说,以下代码在1.9版本中是可以正常运行的:

from pydantic import BaseSettings, Field
import os
import logging
import sys

class Settings(BaseSettings):
    my_list: list[str] = Field(..., env="MY_LIST")

    class Config:
        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)

result - my_list=['a', 'b']

但是更新到2.6后,使用pydantic_settings就出现了错误:

from pydantic import Field
from pydantic_settings import BaseSettings
import os
import logging
import sys

class Settings(BaseSettings):
    my_list: list[str] = Field(..., env="MY_LIST")

    class Config:
        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)

CRITICAL:root:required settings not provided, shutting down - 1 validation error for Settings
my_list
  Input should be a valid list [type=list_type, input_value='["a","b"]', input_type=str]
    For further information visit https://errors.pydantic.dev/2.6/v/list_type

有没有办法让它恢复到原来的行为呢?

1 个回答

0

我通过把 env="MY_LIST" 改成 alias="MY_LIST" 来解决这个问题。奇怪的是,其他变量的 env_prefix 竟然干扰了这个设置。

撰写回答