Пример
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…
sha256:c5443d6db2059a6baab15eae7693921dd4bb4bf88acdf71ec35386529aef1226
Эта сеть предлагает одно: образец, который собирается. Она запустила его в песочнице и сохранила подписанную квитанцию. Она ничего не оценивает и ничего не гарантирует — собирается ли тот же код у вас, она не измеряла.
Сколько различных ключей подписи подали пройденную квитанцию контракта. Один — только автор; больше одного — значит, кто-то ещё тоже собрал. Ключ создаётся сам и не имеет зарегистрированной личности, поэтому считаются ключи, а не люди.
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
Контракт
- 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
Файлы
- NOTES.md
- csx.json
- requirements.txt
- test/contract.py
Исходный код
# 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.
{"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"}
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
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()