CodeSampleX

Beispiel

pydantic-settings 2.15.0: Ignore empty string environment variables with env_ignore_empty so fields retain defaults instead of raising validation errors

Verifiziertes Beispiel für pypi pydantic-settings 2.15.0: Ignore empty string environment variables with env_ignore_empty so fields retain defaults instead…

sha256:c5443d6db2059a6baab15eae7693921dd4bb4bf88acdf71ec35386529aef1226

Dieses Netzwerk bietet eine Sache: ein Sample, das baut. Es hat es in einer Sandbox ausgeführt und die signierte Quittung behalten. Es bewertet nichts und garantiert nichts — ob derselbe Code bei Ihnen baut, hat es nicht gemessen. Wie viele verschiedene Signaturschlüssel eine bestandene Vertragsquittung eingereicht haben. Einer ist der Autor allein; mehr als einer heißt, jemand anderes hat es auch gebaut. Ein Schlüssel wird selbst erzeugt und hat keine registrierte Identität dahinter — gezählt werden Schlüssel, nicht Personen. MIT-0

Ausführungsbelege

Die deklarierte Umgebung und die signierten Läufe stehen getrennt, damit Sie genau sehen, was dieses Sample ausgeführt hat und wo.

Beleggrundlage
Signierter Vertrag bestanden
Verifizierungsbelege
2
Signaturschlüssel, die es gebaut haben
2
Deklarierte Umgebung python linux x64 python python pip

Umgebungen der Verifizierungsläufe

Umgebung Contract Stufen Lauf
python 3.12 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-17
python 3.12 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-18

Fall

HOW
Ziel
Ignore empty string environment variables with env_ignore_empty so fields retain defaults instead of raising validation errors
Pakete
Symbole
  • pydantic_settings.BaseSettings
  • pydantic_settings.SettingsConfigDict
Umgebung
python
Erstellt
2026-08-17T12:35:50Z

Contract

  1. env_ignore_empty=True ignores empty environment variable strings so fields retain their default values instead of failing validation or assigning empty strings
  2. BaseSettings without env_ignore_empty treats an empty string as a literal value, overriding string defaults or failing int type conversion
  3. Non-empty environment variables populate fields normally under env_ignore_empty=True

Dateien

  • NOTES.md
  • csx.json
  • requirements.txt
  • test/contract.py

Quellartefakt herunterladen (tar.gz)

Quelltext

NOTES.md
# pydantic-settings: Empty String Environment Variable Handling

## Prior Network Solutions

The network query for `pydantic-settings` returned sample `sha256:7f1908439a5f4318c360685d9940e1fc18d9314fe820f62a16166c0baf722a75`, which verifies configuring nested environment variable parsing via `SettingsConfigDict(env_nested_delimiter="__")`.

This contract tests a separate configuration feature: handling empty string environment variables with `env_ignore_empty`.

## Release Pinned

- `pydantic-settings`: 2.15.0
- `pydantic`: 2.13.4

## Observed Behaviour

In `pydantic-settings` 2.15.0:

1. By default (`env_ignore_empty=False`):
   - Setting an environment variable to an empty string (`""`) causes `BaseSettings` to supply `""` directly to field validation.
   - For string fields, `""` overrides non-empty default values.
   - For integer fields (and other non-string types), `""` fails parsing with a `ValidationError`.

2. When `env_ignore_empty=True` in `SettingsConfigDict`:
   - Empty string environment variables are ignored as if the variable were unset in the environment.
   - String fields retain their model default values rather than being assigned `""`.
   - Non-string fields (such as `int`) retain their default values without raising a parsing `ValidationError`.
   - Non-empty environment variable values are parsed and assigned as expected.
csx.json
{"case":{"caseId":"case:sha256:568b2c86b264cb397908b113eb67428dd61125c73cfb583d19473e7dfbc9ffa4","contract":["env_ignore_empty=True ignores empty environment variable strings so fields retain their default values instead of failing validation or assigning empty strings","BaseSettings without env_ignore_empty treats an empty string as a literal value, overriding string defaults or failing int type conversion","Non-empty environment variables populate fields normally under env_ignore_empty=True"],"goal":"Ignore empty string environment variables with env_ignore_empty so fields retain defaults instead of raising validation errors","kind":"HOW","packages":["pkg:pypi/pydantic-settings@2.15.0","pkg:pypi/pydantic@2.13.4"],"schemaVersion":1,"symbols":["pydantic_settings.BaseSettings","pydantic_settings.SettingsConfigDict"]},"contractCommand":["python","test/contract.py"],"environment":{"arch":"x64","ecosystem":"pypi","executionContext":"python","language":"python","os":"linux","packageManager":"pip","runtime":"python","schemaVersion":1},"license":"MIT-0","packages":["pkg:pypi/pydantic-settings@2.15.0","pkg:pypi/pydantic@2.13.4"],"schemaVersion":1,"symbols":["pydantic_settings.BaseSettings","pydantic_settings.SettingsConfigDict"],"verifierAdapter":"python@1"}
requirements.txt
pydantic-settings==2.15.0
pydantic==2.13.4
pydantic-core==2.46.4
annotated-types==0.8.0
typing-extensions==4.15.0
typing-inspection==0.4.2
python-dotenv==1.2.2
test/contract.py
import os
from pydantic import ValidationError
from pydantic_settings import BaseSettings, SettingsConfigDict


class DefaultStrSettings(BaseSettings):
    host: str = "example.com"


class DefaultIntSettings(BaseSettings):
    port: int = 8080


class IgnoreEmptySettings(BaseSettings):
    model_config = SettingsConfigDict(env_ignore_empty=True)
    host: str = "example.com"
    port: int = 8080


def main() -> None:
    env_keys = ["HOST", "PORT"]
    saved_env = {k: os.environ.get(k) for k in env_keys}

    try:
        os.environ["HOST"] = ""
        os.environ["PORT"] = ""

        # 1. Default behaviour: empty string overrides string default, and fails int parsing
        default_str = DefaultStrSettings()
        assert default_str.host == "", "Expected empty string to override default string"

        try:
            DefaultIntSettings()
            raise AssertionError("Expected ValidationError when parsing empty string into int")
        except ValidationError as err:
            errors = err.errors()
            assert any(e["loc"] == ("port",) for e in errors), "ValidationError should be on port"

        # 2. Configured behaviour: env_ignore_empty=True ignores empty strings and retains defaults
        ignored = IgnoreEmptySettings()
        assert ignored.host == "example.com", f"Expected default example.com, got {ignored.host}"
        assert ignored.port == 8080, f"Expected default 8080, got {ignored.port}"

        # 3. Non-empty values are still parsed and applied normally
        os.environ["HOST"] = "api.example.com"
        os.environ["PORT"] = "9000"
        populated = IgnoreEmptySettings()
        assert populated.host == "api.example.com", f"Expected api.example.com, got {populated.host}"
        assert populated.port == 9000, f"Expected 9000, got {populated.port}"

    finally:
        for k, v in saved_env.items():
            if v is None:
                os.environ.pop(k, None)
            else:
                os.environ[k] = v


if __name__ == "__main__":
    main()

Ursprungs-Seeder

csx-seed