@@ -51,8 +51,17 @@ def _default_factory():
5151 return _default_factory
5252
5353
54- class CustomEnvSettingsSource (EnvSettingsSource ):
55- def __init__ (self , settings_cls : BaseSettings , env_settings : EnvSettingsSource ):
54+ def _is_auto_default_from_env_enabled (field : FieldInfo ) -> bool :
55+ return bool (
56+ field .json_schema_extra is not None
57+ and field .json_schema_extra .get ("auto_default_from_env" , False )
58+ )
59+
60+
61+ class EnvSettingsWithAutoDefaultSource (EnvSettingsSource ):
62+ def __init__ (
63+ self , settings_cls : type [BaseSettings ], env_settings : EnvSettingsSource
64+ ):
5665 super ().__init__ (
5766 settings_cls ,
5867 env_settings .case_sensitive ,
@@ -73,7 +82,12 @@ def prepare_field_value(
7382 prepared_value = super ().prepare_field_value (
7483 field_name , field , value , value_is_complex
7584 )
76- if field .default_factory and field .default is None and prepared_value == {}:
85+ if (
86+ _is_auto_default_from_env_enabled (field )
87+ and field .default_factory
88+ and field .default is None
89+ and prepared_value == {}
90+ ):
7791 prepared_value = field .default_factory ()
7892 return prepared_value
7993
@@ -114,12 +128,7 @@ def __pydantic_init_subclass__(cls, **kwargs: Any):
114128 super ().__pydantic_init_subclass__ (** kwargs )
115129
116130 for name , field in cls .model_fields .items ():
117- auto_default_from_env = (
118- field .json_schema_extra is not None
119- and field .json_schema_extra .get ( # type: ignore[union-attr]
120- "auto_default_from_env" , False
121- )
122- )
131+ auto_default_from_env = _is_auto_default_from_env_enabled (field )
123132 field_type = get_type (field )
124133
125134 # Avoids issubclass raising TypeError. SEE test_issubclass_type_error_with_pydantic_models
@@ -134,7 +143,7 @@ def __pydantic_init_subclass__(cls, **kwargs: Any):
134143 and issubclass (field_type , BaseCustomSettings )
135144 ):
136145 if auto_default_from_env :
137- # Transform it into something like `Field(default_factory=create_settings_from_env(field))`
146+ # Builds a default factory `Field(default_factory=create_settings_from_env(field))`
138147 field .default_factory = _create_settings_from_env (name , field )
139148 field .default = None
140149
@@ -171,7 +180,7 @@ def settings_customise_sources(
171180 assert env_settings # nosec
172181 return (
173182 init_settings ,
174- CustomEnvSettingsSource (settings_cls , env_settings = env_settings ),
183+ EnvSettingsWithAutoDefaultSource (settings_cls , env_settings = env_settings ),
175184 dotenv_settings ,
176185 file_secret_settings ,
177186 )
0 commit comments