Skip to content

Instantly share code, notes, and snippets.

@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 / 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 / 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 / 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 / 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 / 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 / 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 / set_no_coercion.py
Last active October 4, 2020 18:38
Pydantic setter doesnt validate input types
from pydantic import BaseModel
class Pizza(BaseModel):
toppings_count: int
size: str
def test_set_field_doesnt_perform_coercion():
pizza = Pizza(toppings_count='4', size='XL') # 1
@gidgid
gidgid / validate_assignment_fixes_setter.py
Last active October 4, 2020 09:51
validate_assignment fixes setter type coercion problem
import pytest
from pydantic import BaseModel, ValidationError
class Pizza(BaseModel):
toppings_count: int
size: str
class Config: # 1
validate_assignment = True # 2
@gidgid
gidgid / pydantic_constraint_types.py
Last active October 4, 2020 12:28
pydantic constrained types
import pytest
from pydantic import BaseModel, conlist, constr, ValidationError
class User(BaseModel):
name: constr(min_length=1) # 1
scores: conlist(int, min_items=1) # 2
def report(user: User):