0 - Pre-reqs#
Python Types#
def get_full_name(first_name, last_name):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
John Doe
def get_full_name(first_name: str, last_name: str):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
John Doe
def process_items(items: list[str]):
for item in items:
print(item)
process_items(['a', 'b', 'c'])
a
b
c
def process_items(prices: dict[str, float]):
for item_name, item_price in prices.items():
print(item_name)
print(item_price)
process_items({
'Banana': 1.23,
'Bread': 2.23
})
Banana
1.23
Bread
2.23
Union#
Union from typing allows you to use one of a list of types.
from typing import Union
def process_item(item: Union[int, str]):
print(item)
process_item('Hello')
process_item(42)
Hello
42
As of Python 3.10, you can also do the following:
def process_item(item: int | str):
print(item)
process_item('Hello')
process_item(42)
Hello
42
Optional#
Optional from typing allows the type to also be None.
from typing import Optional
def say_hi(name: Optional[str] = None):
if name is not None:
print(f"Hey {name}!")
else:
print("Hello World")
say_hi('Michael')
say_hi()
Hey Michael!
Hello World
As of Python 3.10, you can also do the following:
def say_hi(name: str | None = None):
if name is not None:
print(f"Hey {name}!")
else:
print("Hello World")
say_hi('Michael')
say_hi()
Hey Michael!
Hello World
Pydantic#
pydantic is a Python library to perform data validation.
from datetime import datetime
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe"
signup_ts: datetime | None = None
friends: list[int] = []
external_data = {
"id": "123",
"signup_ts": "2017-06-01 12:22",
"friends": [1, "2", b"3"],
}
# Note that ** unpacks the dictionary into a list of keyword arguments
user = User(**external_data)
print(user)
# > User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
print(user.id)
# > 123
id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
123
Annotated#
This allows you to include metadata in your type hints.
from typing import Annotated
def say_hello(name: Annotated[str, "this is just metadata"]) -> str:
return f"Hello {name}"
say_hello('Michael')
'Hello Michael'
Concurrency and async / await#
if you are using third party libraries that tell you to call them with await, then declare your path operation function with async def:
@app.get('/')
async def read_results():
results = await some_library()
return results
Note that you can only use await inside functions created with async def. async basically gives Python permission to stop a function and go do something else.
Note that async functions can only be run inside of other async functions. FastAPI handles this, so there isn’t too much to worry about when using it.