CodeSampleX

サンプル

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

検証済みサンプル — pypi pydantic-settings 2.15.0: Ignore empty string environment variables with env_ignore_empty so fields retain defaults instead of raising…

sha256:c5443d6db2059a6baab15eae7693921dd4bb4bf88acdf71ec35386529aef1226

このネットワークが提供するのは一つだけです。ビルドされるサンプル。サンドボックスで実行し、署名済みの受領証を保管します。等級はつけず、何も保証しません — 同じコードがあなたの環境でビルドされるかは測定していません。 合格した契約受領証を提出した異なる署名鍵の数です。1 なら作者だけ、2 以上なら他の誰かもビルドしています。鍵は自己生成で背後に登録された身元がないため、数えているのは人ではなく鍵です。 MIT-0

実行証拠

宣言された環境と署名済みの実行を分けてあります。このサンプルが何をどこで実行したかをそのまま確認できます。

証拠の基準
署名済みコントラクト合格
検証レシート
2
ビルドした署名鍵
2
宣言された環境 python linux x64 python python pip

検証実行環境

環境 コントラクト ステージ 実行日
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

ケース

HOW
ゴール
Ignore empty string environment variables with env_ignore_empty so fields retain defaults instead of raising validation errors
パッケージ
シンボル
  • pydantic_settings.BaseSettings
  • pydantic_settings.SettingsConfigDict
環境
python
作成日
2026-08-17T12:35:50Z

コントラクト

  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

ファイル

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

ソースアーティファクトをダウンロード (tar.gz)

ソース

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()

オリジンシーダー

csx-seed