📝 Add docs recommending Union over Optional and migrate source examples (#4908)

* 📝 Add docs recommending Union over Optional

* 📝 Update docs recommending Union over Optional

* 📝 Update source examples for docs, recommend Union over Optional

* 📝 Update highlighted lines with updated source examples

* 📝 Update highlighted lines in Markdown with recent code changes

* 📝 Update docs, use Union instead of Optional

* ♻️ Update source examples to recommend Union over Optional

* 🎨 Update highlighted code in Markdown after moving from Optional to Union
This commit is contained in:
Sebastián Ramírez
2022-05-14 06:59:59 -05:00
committed by GitHub
parent c5be1b0550
commit ca437cdfab
131 changed files with 489 additions and 426 deletions

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from fastapi.responses import FileResponse
@@ -23,7 +23,7 @@ app = FastAPI()
}
},
)
async def read_item(item_id: str, img: Optional[bool] = None):
async def read_item(item_id: str, img: Union[bool, None] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from fastapi.responses import FileResponse
@@ -25,7 +25,7 @@ app = FastAPI()
response_model=Item,
responses={**responses, 200: {"content": {"image/png": {}}}},
)
async def read_item(item_id: str, img: Optional[bool] = None):
async def read_item(item_id: str, img: Union[bool, None] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import BackgroundTasks, Depends, FastAPI
@@ -10,7 +10,7 @@ def write_log(message: str):
log.write(message)
def get_query(background_tasks: BackgroundTasks, q: Optional[str] = None):
def get_query(background_tasks: BackgroundTasks, q: Union[str, None] = None):
if q:
message = f"found query: {q}\n"
background_tasks.add_task(write_log, message)

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -6,9 +6,9 @@ from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
app = FastAPI()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -6,9 +6,9 @@ from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
app = FastAPI()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -6,9 +6,9 @@ from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
app = FastAPI()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -6,16 +6,16 @@ from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
async def create_item(item_id: int, item: Item, q: Union[str, None] = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,14 +8,14 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
class User(BaseModel):
username: str
full_name: Optional[str] = None
full_name: Union[str, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: list = []

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: List[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: list[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()
image: Optional[Image] = None
image: Union[Image, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()
image: Optional[Image] = None
image: Union[Image, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()
image: Optional[Image] = None
image: Union[Image, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()
image: Optional[Image] = None
image: Union[Image, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import List, Optional, Set
from typing import List, Set, Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()
images: Optional[List[Image]] = None
images: Union[List[Image], None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()
images: Optional[list[Image]] = None
images: Union[list[Image], None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import List, Optional, Set
from typing import List, Set, Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@@ -13,16 +13,16 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()
images: Optional[List[Image]] = None
images: Union[List[Image], None] = None
class Offer(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
items: List[Item]

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@@ -13,16 +13,16 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()
images: Optional[list[Image]] = None
images: Union[list[Image], None] = None
class Offer(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
items: list[Item]

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
price: Optional[float] = None
name: Union[str, None] = None
description: Union[str, None] = None
price: Union[float, None] = None
tax: float = 10.5
tags: List[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
price: Optional[float] = None
name: Union[str, None] = None
description: Union[str, None] = None
price: Union[float, None] = None
tax: float = 10.5
tags: list[str] = []

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
price: Optional[float] = None
name: Union[str, None] = None
description: Union[str, None] = None
price: Union[float, None] = None
tax: float = 10.5
tags: List[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
price: Optional[float] = None
name: Union[str, None] = None
description: Union[str, None] = None
price: Union[float, None] = None
tax: float = 10.5
tags: list[str] = []

View File

@@ -1,5 +1,5 @@
from dataclasses import dataclass
from typing import Optional
from typing import Union
from fastapi import FastAPI
@@ -8,8 +8,8 @@ from fastapi import FastAPI
class Item:
name: str
price: float
description: Optional[str] = None
tax: Optional[float] = None
description: Union[str, None] = None
tax: Union[float, None] = None
app = FastAPI()

View File

@@ -1,5 +1,5 @@
from dataclasses import dataclass, field
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
@@ -9,8 +9,8 @@ class Item:
name: str
price: float
tags: List[str] = field(default_factory=list)
description: Optional[str] = None
tax: Optional[float] = None
description: Union[str, None] = None
tax: Union[float, None] = None
app = FastAPI()

View File

@@ -1,5 +1,5 @@
from dataclasses import field # (1)
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
from pydantic.dataclasses import dataclass # (2)
@@ -8,7 +8,7 @@ from pydantic.dataclasses import dataclass # (2)
@dataclass
class Item:
name: str
description: Optional[str] = None
description: Union[str, None] = None
@dataclass

View File

@@ -1,11 +1,13 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI
app = FastAPI()
async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
async def common_parameters(
q: Union[str, None] = None, skip: int = 0, limit: int = 100
):
return {"q": q, "skip": skip, "limit": limit}

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI
@@ -9,7 +9,7 @@ fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
class CommonQueryParams:
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
def __init__(self, q: Union[str, None] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI
@@ -9,7 +9,7 @@ fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
class CommonQueryParams:
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
def __init__(self, q: Union[str, None] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI
@@ -9,7 +9,7 @@ fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
class CommonQueryParams:
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
def __init__(self, q: Union[str, None] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit

View File

@@ -1,16 +1,17 @@
from typing import Optional
from typing import Union
from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
def query_extractor(q: Optional[str] = None):
def query_extractor(q: Union[str, None] = None):
return q
def query_or_cookie_extractor(
q: str = Depends(query_extractor), last_query: Optional[str] = Cookie(default=None)
q: str = Depends(query_extractor),
last_query: Union[str, None] = Cookie(default=None),
):
if not q:
return last_query

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient
@@ -6,7 +6,9 @@ from fastapi.testclient import TestClient
app = FastAPI()
async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
async def common_parameters(
q: Union[str, None] = None, skip: int = 0, limit: int = 100
):
return {"q": q, "skip": skip, "limit": limit}
@@ -23,7 +25,7 @@ async def read_users(commons: dict = Depends(common_parameters)):
client = TestClient(app)
async def override_dependency(q: Optional[str] = None):
async def override_dependency(q: Union[str, None] = None):
return {"q": q, "skip": 5, "limit": 10}

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Optional
from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@@ -11,7 +11,7 @@ fake_db = {}
class Item(BaseModel):
title: str
timestamp: datetime
description: Optional[str] = None
description: Union[str, None] = None
app = FastAPI()

View File

@@ -1,5 +1,5 @@
from datetime import datetime, time, timedelta
from typing import Optional
from typing import Union
from uuid import UUID
from fastapi import Body, FastAPI
@@ -10,10 +10,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: Optional[datetime] = Body(default=None),
end_datetime: Optional[datetime] = Body(default=None),
repeat_at: Optional[time] = Body(default=None),
process_after: Optional[timedelta] = Body(default=None),
start_datetime: Union[datetime, None] = Body(default=None),
end_datetime: Union[datetime, None] = Body(default=None),
repeat_at: Union[time, None] = Body(default=None),
process_after: Union[timedelta, None] = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@@ -10,20 +10,20 @@ class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
class UserInDB(BaseModel):
username: str
hashed_password: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
def fake_password_hasher(raw_password: str):

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@@ -9,7 +9,7 @@ app = FastAPI()
class UserBase(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
class UserIn(UserBase):

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Header
@@ -6,5 +6,5 @@ app = FastAPI()
@app.get("/items/")
async def read_items(user_agent: Optional[str] = Header(default=None)):
async def read_items(user_agent: Union[str, None] = Header(default=None)):
return {"User-Agent": user_agent}

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Header
@@ -7,6 +7,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
strange_header: Optional[str] = Header(default=None, convert_underscores=False)
strange_header: Union[str, None] = Header(default=None, convert_underscores=False)
):
return {"strange_header": strange_header}

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI, Header
@@ -6,5 +6,5 @@ app = FastAPI()
@app.get("/items/")
async def read_items(x_token: Optional[List[str]] = Header(default=None)):
async def read_items(x_token: Union[List[str], None] = Header(default=None)):
return {"X-Token values": x_token}

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Header
@@ -6,5 +6,5 @@ app = FastAPI()
@app.get("/items/")
async def read_items(x_token: Optional[list[str]] = Header(default=None)):
async def read_items(x_token: Union[list[str], None] = Header(default=None)):
return {"X-Token values": x_token}

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from couchbase import LOCKMODE_WAIT
from couchbase.bucket import Bucket
@@ -23,9 +23,9 @@ def get_bucket():
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
email: Union[str, None] = None
full_name: Union[str, None] = None
disabled: Union[bool, None] = None
class UserInDB(User):

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl
@@ -8,7 +8,7 @@ app = FastAPI()
class Invoice(BaseModel):
id: str
title: Optional[str] = None
title: Union[str, None] = None
customer: str
total: float
@@ -33,7 +33,7 @@ def invoice_notification(body: InvoiceEvent):
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Optional[HttpUrl] = None):
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
"""
Create an invoice.

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI, status
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, status
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional, Set
from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: Set[str] = set()

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: set[str] = set()

View File

@@ -0,0 +1,5 @@
from typing import Optional
def say_hi(name: Optional[str]):
print(f"Hey {name}!")

View File

@@ -0,0 +1,2 @@
def say_hi(name: str | None):
print(f"Hey {name}!")

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import List, Optional
from typing import List, Union
from pydantic import BaseModel
@@ -7,7 +7,7 @@ from pydantic import BaseModel
class User(BaseModel):
id: int
name = "John Doe"
signup_ts: Optional[datetime] = None
signup_ts: Union[datetime, None] = None
friends: List[int] = []

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Optional
from typing import Union
from pydantic import BaseModel
@@ -7,7 +7,7 @@ from pydantic import BaseModel
class User(BaseModel):
id: int
name = "John Doe"
signup_ts: Optional[datetime] = None
signup_ts: Union[datetime, None] = None
friends: list[int] = []

View File

@@ -0,0 +1,8 @@
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
name: str
age: Optional[int]

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None):
async def read_item(item_id: str, q: Union[str, None] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
async def read_item(item_id: str, q: Union[str, None] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
@@ -7,7 +7,7 @@ app = FastAPI()
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
user_id: int, item_id: str, q: Optional[str] = None, short: bool = False
user_id: int, item_id: str, q: Union[str, None] = None, short: bool = False
):
item = {"item_id": item_id, "owner_id": user_id}
if q:

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
@@ -7,7 +7,7 @@ app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(
item_id: str, needy: str, skip: int = 0, limit: Optional[int] = None
item_id: str, needy: str, skip: int = 0, limit: Union[int, None] = None
):
item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
return item

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = None):
async def read_items(q: Union[str, None] = None):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, File, UploadFile
@@ -6,7 +6,7 @@ app = FastAPI()
@app.post("/files/")
async def create_file(file: Optional[bytes] = File(default=None)):
async def create_file(file: Union[bytes, None] = File(default=None)):
if not file:
return {"message": "No file sent"}
else:
@@ -14,7 +14,7 @@ async def create_file(file: Optional[bytes] = File(default=None)):
@app.post("/uploadfile/")
async def create_upload_file(file: Optional[UploadFile] = None):
async def create_upload_file(file: Union[UploadFile, None] = None):
if not file:
return {"message": "No upload file sent"}
else:

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Optional
from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@@ -10,7 +10,7 @@ from pydantic import BaseModel
class Item(BaseModel):
title: str
timestamp: datetime
description: Optional[str] = None
description: Union[str, None] = None
app = FastAPI()

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: List[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
tags: list[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@@ -10,7 +10,7 @@ class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
# Don't do this in production!

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@@ -10,13 +10,13 @@ class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None
full_name: Union[str, None] = None
@app.post("/user/", response_model=UserOut)

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,7 +8,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: float = 10.5
tags: List[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,7 +8,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: float = 10.5
tags: list[str] = []

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,7 +8,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: float = 10.5

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,7 +8,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: float = 10.5

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
class Config:
schema_extra = {

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, Field
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str = Field(example="Foo")
description: Optional[str] = Field(default=None, example="A very nice Item")
description: Union[str, None] = Field(default=None, example="A very nice Item")
price: float = Field(example=35.4)
tax: Optional[float] = Field(default=None, example=3.2)
tax: Union[float, None] = Field(default=None, example=3.2)
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
@@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
description: Union[str, None] = None
price: float
tax: Optional[float] = None
tax: Union[float, None] = None
@app.put("/items/{item_id}")

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
@@ -11,9 +11,9 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
email: Union[str, None] = None
full_name: Union[str, None] = None
disabled: Union[bool, None] = None
def fake_decode_token(token):

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
@@ -33,9 +33,9 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
email: Union[str, None] = None
full_name: Union[str, None] = None
disabled: Union[bool, None] = None
class UserInDB(User):

View File

@@ -1,5 +1,5 @@
from datetime import datetime, timedelta
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
@@ -31,14 +31,14 @@ class Token(BaseModel):
class TokenData(BaseModel):
username: Optional[str] = None
username: Union[str, None] = None
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
email: Union[str, None] = None
full_name: Union[str, None] = None
disabled: Union[bool, None] = None
class UserInDB(User):
@@ -75,7 +75,7 @@ def authenticate_user(fake_db, username: str, password: str):
return user
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta

View File

@@ -1,5 +1,5 @@
from datetime import datetime, timedelta
from typing import List, Optional
from typing import List, Union
from fastapi import Depends, FastAPI, HTTPException, Security, status
from fastapi.security import (
@@ -42,15 +42,15 @@ class Token(BaseModel):
class TokenData(BaseModel):
username: Optional[str] = None
username: Union[str, None] = None
scopes: List[str] = []
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
email: Union[str, None] = None
full_name: Union[str, None] = None
disabled: Union[bool, None] = None
class UserInDB(User):
@@ -90,7 +90,7 @@ def authenticate_user(fake_db, username: str, password: str):
return user
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta

View File

@@ -1,5 +1,5 @@
from datetime import datetime, timedelta
from typing import Optional
from typing import Union
from fastapi import Depends, FastAPI, HTTPException, Security, status
from fastapi.security import (
@@ -42,15 +42,15 @@ class Token(BaseModel):
class TokenData(BaseModel):
username: Optional[str] = None
username: Union[str, None] = None
scopes: list[str] = []
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
email: Union[str, None] = None
full_name: Union[str, None] = None
disabled: Union[bool, None] = None
class UserInDB(User):
@@ -90,7 +90,7 @@ def authenticate_user(fake_db, username: str, password: str):
return user
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta

View File

@@ -1,11 +1,11 @@
from typing import List, Optional
from typing import List, Union
from pydantic import BaseModel
class ItemBase(BaseModel):
title: str
description: Optional[str] = None
description: Union[str, None] = None
class ItemCreate(ItemBase):

View File

@@ -1,11 +1,11 @@
from typing import Optional
from typing import Union
from pydantic import BaseModel
class ItemBase(BaseModel):
title: str
description: Optional[str] = None
description: Union[str, None] = None
class ItemCreate(ItemBase):

View File

@@ -1,4 +1,4 @@
from typing import Any, List, Optional
from typing import Any, List, Union
import peewee
from pydantic import BaseModel
@@ -15,7 +15,7 @@ class PeeweeGetterDict(GetterDict):
class ItemBase(BaseModel):
title: str
description: Optional[str] = None
description: Union[str, None] = None
class ItemCreate(ItemBase):

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import Cookie, Depends, FastAPI, Query, WebSocket, status
from fastapi.responses import HTMLResponse
@@ -57,8 +57,8 @@ async def get():
async def get_cookie_or_token(
websocket: WebSocket,
session: Optional[str] = Cookie(default=None),
token: Optional[str] = Query(default=None),
session: Union[str, None] = Cookie(default=None),
token: Union[str, None] = Query(default=None),
):
if session is None and token is None:
await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
@@ -69,7 +69,7 @@ async def get_cookie_or_token(
async def websocket_endpoint(
websocket: WebSocket,
item_id: str,
q: Optional[int] = None,
q: Union[int, None] = None,
cookie_or_token: str = Depends(get_cookie_or_token),
):
await websocket.accept()