Skip to content

Instantly share code, notes, and snippets.

@gidgid
gidgid / copy_doesnt_coerce.py
Last active November 20, 2020 13:37
Pydantic copy doesnt perform type coercion
from pydantic import BaseModel
class Pizza(BaseModel):
toppings_count: int
size: str
def test_copy_with_update_doesnt_perform_conversion():
pizza = Pizza(toppings_count='4', size='XL') # 1
@gidgid
gidgid / pydantic_field_aliases_example.py
Created October 4, 2020 08:52
Using Pydantic field aliases to bridge inconsistent naming
import pytest
from pydantic import BaseModel, Field, ValidationError
class Item(BaseModel):
item_id: str
is_available: bool = Field(alias='isAvailable') # 1
def test_field_aliasing_bridges_inconsistant_conventions():
@gidgid
gidgid / hide_underscore_prefixed_fields_example.py
Created October 4, 2020 08:47
Pydantic hides fields starting with underscore
from pydantic import BaseModel
class Item(BaseModel):
_id: str # 1
is_available: bool
def test_pydantic_hides_names_with_preceding_underscores():
item = Item(_id='test-item-id', is_available=True) # 1
@gidgid
gidgid / camelcase_naming_example.py
Last active October 4, 2020 08:44
Camelcase names are weird in Python
from pydantic import BaseModel
class Item(BaseModel):
id: str # 1
isAvailable: bool # 2
def test_does_it_look_pythonic_to_you():
item = Item(id='test-item-id', isAvailable=True) # 3
@gidgid
gidgid / validate_http_url.py
Last active October 1, 2020 19:43
Using HttpUrl with validate_arguments
from typing import Optional
from pydantic import validate_arguments, HttpUrl, PositiveInt
@validate_arguments
def better_get_payload(
url: HttpUrl, # 1
retries: PositiveInt
) -> Optional[dict]:
# send the actual request - no need to verify URL # 2
return {}
@gidgid
gidgid / validate_arguments.py
Last active June 3, 2023 14:03
Leveraging validate_arguments to perform validations
import pytest
from typing import Optional
from pydantic import validate_arguments, PositiveInt, ValidationError
@validate_arguments # 1
def validated_get_payload(url: str, retries: PositiveInt) -> Optional[dict]:
if url.startswith("http"):
# send the actual request and return the payload if valid response
return {}
@gidgid
gidgid / no_validation_funcs.py
Created October 1, 2020 19:31
Regular Python functions with no validation
import pytest
from typing import Optional
from pydantic import PositiveInt, ValidationError
def get_payload(url: str, retries: PositiveInt) -> Optional[dict]: # 1
if url.startswith("http"):
# send the actual request and return the payload if valid response
return {}
return None
@gidgid
gidgid / root_with_literals.py
Last active September 30, 2020 19:24
Reading settings models according to the environment
import os
import pytest
from pydantic import BaseSettings, HttpUrl, ValidationError
from typing import Union
from typing_extensions import Literal
class LocalContext(BaseSettings): # 1
env: Literal['local'] # 1
echo_server_url: str
@gidgid
gidgid / settings_with_pydantic.py
Last active November 20, 2020 14:48
settings with pydantic
import os
import pytest
from pydantic import BaseSettings, HttpUrl, ValidationError
class Config(BaseSettings): # 1, 2
auth_url: HttpUrl
db_name: str
max_retries: int
@gidgid
gidgid / settings_with_pydantic.py
Last active November 20, 2020 14:42
Reading settings with Pydantic
import os
import pytest
from pydantic import BaseSettings, HttpUrl, ValidationError
class Config(BaseSettings): # 1, 2
auth_url: HttpUrl
db_name: str
max_retries: int