From 484a43956e8dbb0809bf1bffbd578e2ce58da5cf Mon Sep 17 00:00:00 2001 From: Tejas Dixit Date: Tue, 7 Jul 2026 17:01:49 +0530 Subject: [PATCH] Understand how to use pydantic extra, allow, and forbid --- .../exercises/pydantic-extra.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 python_fundamentals/exercises/pydantic-extra.py diff --git a/python_fundamentals/exercises/pydantic-extra.py b/python_fundamentals/exercises/pydantic-extra.py new file mode 100644 index 0000000..95d5eba --- /dev/null +++ b/python_fundamentals/exercises/pydantic-extra.py @@ -0,0 +1,87 @@ +from typing import ClassVar + +from pydantic import BaseModel, ConfigDict, Field, ValidationError + + +class WeatherAPI(BaseModel): + model_config: ClassVar[ConfigDict] = ConfigDict(extra="ignore") + air_quality: int + city: str + + +class BankAccount(BaseModel): + model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") + account_number: str = Field( + min_length=12, + max_length=12, + ) + account_type: str + + +class EventLog(BaseModel): + model_config: ClassVar[ConfigDict] = ConfigDict(extra="allow") + event_id: int + event_type: str + + +""" +BaseModel defines `model_config` as a class-level configuration. + +Annotating it with `ClassVar[ConfigDict]` +tells static type checkers that this attribute +belongs to the class rather than individual instances. +""" + + +if __name__ == "__main__": + print("=" * 60) + print("EventLog (extra='allow')") + print("=" * 60) + + try: + event = EventLog( + event_id=0, + event_type="Error", + event_description="ValidationError", + ) + + print(event.model_dump()) + + except ValidationError as exc: + print(exc) + + print() + + print("=" * 60) + print("WeatherAPI (extra='ignore')") + print("=" * 60) + + try: + pune_weather = WeatherAPI( + city="Pune", + air_quality=10, + humidity="low", # type: ignore + ) + + print(pune_weather.model_dump()) + + except ValidationError as exc: + print(exc) + + print() + + print("=" * 60) + print("BankAccount (extra='forbid')") + print("=" * 60) + + try: + bank_account = BankAccount( + account_number="123456789012", + account_type="Savings", + is_admin=True, # type: ignore + ) + + print(bank_account.model_dump()) + + except ValidationError as exc: + print(exc)