Skip to content

Regression - .env nested optional model support #420

Closed
@slingshotsys

Description

@slingshotsys

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions