Pydantic 使用 BaseSettings 从 .env 文件读取列表
在把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 竟然干扰了这个设置。