Skip to content

Commit a6f6d60

Browse files
authored
Add default value to source classes init params (#82)
1 parent 3e93d17 commit a6f6d60

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

pydantic_settings/main.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from pydantic.main import BaseModel
99

1010
from .sources import (
11+
ENV_FILE_SENTINEL,
1112
DotEnvSettingsSource,
1213
DotenvType,
1314
EnvSettingsSource,
@@ -16,8 +17,6 @@
1617
SecretsSettingsSource,
1718
)
1819

19-
env_file_sentinel: DotenvType = Path('')
20-
2120

2221
class SettingsConfigDict(ConfigDict, total=False):
2322
case_sensitive: bool
@@ -40,7 +39,9 @@ class BaseSettings(BaseModel):
4039
Args:
4140
_case_sensitive: Whether environment variables names should be read with case-sensitivity. Defaults to `None`.
4241
_env_prefix: Prefix for all environment variables. Defaults to `None`.
43-
_env_file: The env file(s) to load settings values from. Defaults to `Path('')`.
42+
_env_file: The env file(s) to load settings values from. Defaults to `Path('')`, which
43+
means that the value from `model_config['env_file']` should be used. You can also pass
44+
`None` to indicate that environment variables should not be loaded from an env file.
4445
_env_file_encoding: The env file encoding, e.g. `'latin-1'`. Defaults to `None`.
4546
_env_nested_delimiter: The nested env values delimiter. Defaults to `None`.
4647
_secrets_dir: The secret files directory. Defaults to `None`.
@@ -50,7 +51,7 @@ def __init__(
5051
__pydantic_self__,
5152
_case_sensitive: bool | None = None,
5253
_env_prefix: str | None = None,
53-
_env_file: DotenvType | None = env_file_sentinel,
54+
_env_file: DotenvType | None = ENV_FILE_SENTINEL,
5455
_env_file_encoding: str | None = None,
5556
_env_nested_delimiter: str | None = None,
5657
_secrets_dir: str | Path | None = None,
@@ -106,7 +107,7 @@ def _settings_build_values(
106107
# Determine settings config values
107108
case_sensitive = _case_sensitive if _case_sensitive is not None else self.model_config.get('case_sensitive')
108109
env_prefix = _env_prefix if _env_prefix is not None else self.model_config.get('env_prefix')
109-
env_file = _env_file if _env_file != env_file_sentinel else self.model_config.get('env_file')
110+
env_file = _env_file if _env_file != ENV_FILE_SENTINEL else self.model_config.get('env_file')
110111
env_file_encoding = (
111112
_env_file_encoding if _env_file_encoding is not None else self.model_config.get('env_file_encoding')
112113
)

pydantic_settings/sources.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323

2424
DotenvType = Union[Path, List[Path], Tuple[Path, ...]]
2525

26+
# This is used as default value for `_env_file` in the `BaseSettings` class and
27+
# `env_file` in `DotEnvSettingsSource` so the default can be distinguished from `None`.
28+
# See the docstring of `BaseSettings` for more details.
29+
ENV_FILE_SENTINEL: DotenvType = Path('')
30+
2631

2732
class SettingsError(ValueError):
2833
pass
@@ -252,12 +257,12 @@ class SecretsSettingsSource(PydanticBaseEnvSettingsSource):
252257
def __init__(
253258
self,
254259
settings_cls: type[BaseSettings],
255-
secrets_dir: str | Path | None,
260+
secrets_dir: str | Path | None = None,
256261
case_sensitive: bool | None = None,
257262
env_prefix: str | None = None,
258263
) -> None:
259264
super().__init__(settings_cls, case_sensitive, env_prefix)
260-
self.secrets_dir = secrets_dir
265+
self.secrets_dir = secrets_dir if secrets_dir is not None else self.config.get('secrets_dir')
261266

262267
def __call__(self) -> dict[str, Any]:
263268
"""
@@ -345,7 +350,9 @@ def __init__(
345350
env_nested_delimiter: str | None = None,
346351
) -> None:
347352
super().__init__(settings_cls, case_sensitive, env_prefix)
348-
self.env_nested_delimiter = env_nested_delimiter
353+
self.env_nested_delimiter = (
354+
env_nested_delimiter if env_nested_delimiter is not None else self.config.get('env_nested_delimiter')
355+
)
349356
self.env_prefix_len = len(self.env_prefix)
350357

351358
self.env_vars = self._load_env_vars()
@@ -528,14 +535,16 @@ class DotEnvSettingsSource(EnvSettingsSource):
528535
def __init__(
529536
self,
530537
settings_cls: type[BaseSettings],
531-
env_file: DotenvType | None,
532-
env_file_encoding: str | None,
538+
env_file: DotenvType | None = ENV_FILE_SENTINEL,
539+
env_file_encoding: str | None = None,
533540
case_sensitive: bool | None = None,
534541
env_prefix: str | None = None,
535542
env_nested_delimiter: str | None = None,
536543
) -> None:
537-
self.env_file = env_file
538-
self.env_file_encoding = env_file_encoding
544+
self.env_file = env_file if env_file != ENV_FILE_SENTINEL else settings_cls.model_config.get('env_file')
545+
self.env_file_encoding = (
546+
env_file_encoding if env_file_encoding is not None else settings_cls.model_config.get('env_file_encoding')
547+
)
539548
super().__init__(settings_cls, case_sensitive, env_prefix, env_nested_delimiter)
540549

541550
def _load_env_vars(self) -> Mapping[str, str | None]:

0 commit comments

Comments
 (0)