如何基于BaseSettings同类字段指定Config类的env_file配置参数
问题原因
你遇到的报错是Python类定义的执行逻辑导致的:
- Python解析类定义时会从上到下顺序执行代码,内部
Config类被解析的时候,外层的Settings类还没有完成完整的定义流程,所以无法引用Settings这个名称触发NameError self是类实例化后才会生成的实例对象引用,而Config属于类的静态配置,在类定义阶段就会完成解析,自然也无法使用self访问类属性
解决方案
下面是两种常用的可行实现方式:
方式1:提前读取环境标识配置(最简洁)
先在类定义外读取环境标识,再传入类配置中使用:
import os from pydantic import BaseSettings # 先读取环境标识,默认值为local ENVIRONMENT = os.getenv("ENVIRONMENT", "local") class Settings(BaseSettings): ENVIRONMENT: str = ENVIRONMENT SECRET_KEY: str = 'somekey' class Config: env_file = ".env.development" if ENVIRONMENT == "development" else ".env.local"
方式2:实例化时动态指定env文件
利用Pydantic BaseSettings实例化支持传入_env_file参数覆盖默认配置的特性,动态加载对应环境的配置文件:
import os from pydantic import BaseSettings class Settings(BaseSettings): ENVIRONMENT: str = 'local' SECRET_KEY: str = 'somekey' def get_settings() -> Settings: # 读取当前环境标识 env = os.getenv("ENVIRONMENT", "local") env_file_path = ".env.development" if env == "development" else ".env.local" # 实例化时传入配置文件路径 return Settings(_env_file=env_file_path) # 全局使用的配置实例 settings = get_settings()
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

