Closed
Description
As of v2.5.0
, the following code fails:
# .env
not_nested=works
NESTED__A=fails
NESTED__b=2
import os
from pydantic import BaseModel
from pydantic_settings import BaseSettings, SettingsConfigDict
class NestedSettings(BaseModel):
A: str
b: int
class Settings(BaseSettings):
not_nested: str
NESTED: NestedSettings | None
model_config = SettingsConfigDict(
env_file=".env",
env_nested_delimiter="__",
extra="forbid",
)
print(Settings())
result:
pydantic_core._pydantic_core.ValidationError: 2 validation errors for Settings
nested__a
Extra inputs are not permitted [type=extra_forbidden, input_value='fails', input_type=str]
For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden
nested__b
Extra inputs are not permitted [type=extra_forbidden, input_value='2', input_type=str]
For further information visit https://errors.pydantic.dev/2.9/v/extra_forbidden
setting extra="allow"
ends up with duplicate NESTED and nested__* fields on the model:
not_nested='works' NESTED=NestedSettings(A='fails', b=2) nested__a='fails' nested__b='2'
removing | None
from NESTED: NestedSettings
works as expected when forbid
is both True
or False
:
not_nested='works' NESTED=NestedSettings(A='fails', b=2)
Using Python 3.12 on Windows 11. This worked as expected in 2.4.0