从环境变量和 dotenv 配置文件中读取配置项。
(self)
| 181 | return result |
| 182 | |
| 183 | def __call__(self) -> dict[str, Any]: |
| 184 | """从环境变量和 dotenv 配置文件中读取配置项。""" |
| 185 | |
| 186 | d: dict[str, Any] = {} |
| 187 | |
| 188 | env_vars = self._parse_env_vars(os.environ) |
| 189 | env_file_vars = self._read_env_files() |
| 190 | env_vars = {**env_file_vars, **env_vars} |
| 191 | |
| 192 | for field in model_fields(self.settings_cls): |
| 193 | field_name = field.name |
| 194 | env_name = self._apply_case_sensitive(field_name) |
| 195 | alias_name = field.field_info.alias |
| 196 | alias_env_name = ( |
| 197 | None if alias_name is None else self._apply_case_sensitive(alias_name) |
| 198 | ) |
| 199 | |
| 200 | # pydantic use alias name to validate if exist |
| 201 | if alias_name is not None: |
| 202 | field_name = alias_name |
| 203 | |
| 204 | # try get values from env vars |
| 205 | env_val = env_vars.get(env_name, PydanticUndefined) |
| 206 | alias_env_val = ( |
| 207 | PydanticUndefined |
| 208 | if alias_env_name is None |
| 209 | else env_vars.get(alias_env_name, PydanticUndefined) |
| 210 | ) |
| 211 | # alias env value has higher priority |
| 212 | env_val = ( |
| 213 | env_val |
| 214 | if isinstance(alias_env_val, PydanticUndefinedType) |
| 215 | else alias_env_val |
| 216 | ) |
| 217 | # delete from file vars when used |
| 218 | if env_name in env_file_vars: |
| 219 | del env_file_vars[env_name] |
| 220 | if alias_env_name is not None and alias_env_name in env_file_vars: |
| 221 | del env_file_vars[alias_env_name] |
| 222 | |
| 223 | is_complex, allow_parse_failure = self._field_is_complex(field) |
| 224 | if is_complex: |
| 225 | if isinstance(env_val, PydanticUndefinedType): |
| 226 | # field is complex but no value found so far, try explode_env_vars |
| 227 | if env_val_built := self._explode_env_vars( |
| 228 | field, env_vars, env_file_vars |
| 229 | ): |
| 230 | d[field_name] = env_val_built |
| 231 | elif env_val is None: |
| 232 | d[field_name] = env_val |
| 233 | else: |
| 234 | # field is complex and there's a value |
| 235 | # decode that as JSON, then add explode_env_vars |
| 236 | try: |
| 237 | env_val = json.loads(env_val) |
| 238 | except ValueError as e: |
| 239 | if not allow_parse_failure: |
| 240 | raise SettingsError( |
nothing calls this directly
no test coverage detected