What if your API could catch data mistakes before they cause bugs, without extra code?
Why List and set validation in FastAPI? - Purpose & Use Cases
Imagine you receive user data where you expect a list of unique items, like email addresses or tags, but users send duplicates or wrong types.
Manually checking each item and ensuring uniqueness can be tedious and error-prone.
Manually validating lists and sets means writing repetitive code to check each element's type and uniqueness.
This approach is slow, easy to forget, and can cause bugs if validation is inconsistent.
FastAPI's list and set validation automatically checks each item's type and ensures uniqueness for sets.
This saves time and prevents errors by handling validation cleanly and consistently.
def validate_emails(data): emails = data.get('emails', []) for email in emails: if not isinstance(email, str): raise ValueError('Invalid email') if len(emails) != len(set(emails)): raise ValueError('Duplicate emails')
from pydantic import BaseModel from typing import Set class UserData(BaseModel): emails: Set[str]
You can trust your data is correct and unique without extra code, making your API safer and easier to maintain.
When building a signup form API, you want to accept a list of user interests without duplicates and ensure each interest is a string.
FastAPI validates this automatically, so your backend logic stays clean.
Manual validation of lists and sets is slow and error-prone.
FastAPI automates type and uniqueness checks for lists and sets.
This leads to safer, cleaner, and easier-to-maintain code.
Practice
List instead of Set for request data validation?Solution
Step 1: Understand List characteristics
A List keeps the order of items and allows duplicates.Step 2: Compare with Set characteristics
A Set removes duplicates and does not guarantee order.Final Answer:
When the order of items matters and duplicates are allowed -> Option DQuick Check:
List = ordered with duplicates [OK]
- Confusing Set with List and expecting order
- Using Set when duplicates are needed
- Thinking List removes duplicates automatically
Solution
Step 1: Identify the correct type for unique collection
Set[int] is used to declare a set of integers with unique values.Step 2: Verify other options
List[int] allows duplicates, dict[int] is invalid syntax, tuple[int] is fixed-length and ordered.Final Answer:
def endpoint(items: Set[int]): -> Option BQuick Check:
Set[int] = unique integer collection [OK]
- Using dict[int] which is invalid syntax
- Using tuple[int] which expects fixed length
- Confusing List with Set for uniqueness
{"items": [1, 2, 2, 3]}?
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Set
app = FastAPI()
class Data(BaseModel):
items: Set[int]
@app.post("/unique")
def unique_items(data: Data):
return {"unique_items": list(data.items)}Solution
Step 1: Understand Set validation in Pydantic
Pydantic converts the input list to a set, removing duplicates automatically.Step 2: Analyze the input and output
Input has duplicates [1, 2, 2, 3], output converts to unique set [1, 2, 3].Final Answer:
{"unique_items": [1, 2, 3]} -> Option AQuick Check:
Set removes duplicates automatically [OK]
- Expecting ValidationError on duplicates
- Assuming output keeps duplicates
- Confusing List and Set behavior
from pydantic import BaseModel
from typing import List, Set
class Model(BaseModel):
names: List[str]
unique_ids: List[int]
def __init__(self, **data):
super().__init__(**data)
self.unique_ids = set(self.unique_ids)Solution
Step 1: Check field type and assignment
unique_ids is declared as List[int] but assigned a set in __init__, causing type mismatch.Step 2: Understand Pydantic validation rules
Pydantic expects unique_ids to be a list; assigning a set breaks validation and type consistency.Final Answer:
Assigning a set to a List field breaks Pydantic validation -> Option CQuick Check:
Field type must match assigned value [OK]
- Assigning set to List field without changing type
- Ignoring Pydantic's type enforcement
- Assuming __init__ can override field types safely
Solution
Step 1: Ensure uniqueness with Set
Using Set[str] automatically removes duplicates.Step 2: Add validator to reject empty strings
Since Set only ensures uniqueness, a validator is needed to reject empty tags.Final Answer:
Use tags: Set[str] and add a validator to reject empty strings -> Option AQuick Check:
Set + validator = unique + no empty tags [OK]
- Using List without uniqueness enforcement
- Not validating empty strings in Set
- Relying on manual checks in endpoint instead of validators
Ready to prove it?
Pass the test and this pattern moves unknown
