Use `TypedDict` replace pydantic definitions.
Project description
TypedDict
Use TypedDict
replace pydantic definitions.
Why?
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int = Field(default=0, ge=0)
email: Optional[str]
user: User = {"name": "John", "age": 30} # Type check, error!
print(repr(user))
In index.py or other framework, maybe you write the following code. And then got an type check error in Annotated[Message, ...]
, because the type of {"message": "..."}
is not Message
.
class Message(BaseModel):
message: str
@routes.http.post("/user")
async def create_user(
...
) -> Annotated[Message, JSONResponse[200, {}, Message]]:
...
return {"message": "Created successfully!"}
Usage
Use Annotated
to provide extra information to pydantic.Field
. Other than that, everything conforms to the general usage of TypedDict
. Using to_pydantic
will create a semantically equivalent pydantic model. You can use it in frameworks like index.py / fastapi / xpresso.
from typing_extensions import Annotated, NotRequired, TypedDict
import typeddict
from typeddict import Extra, Metadata
class User(TypedDict):
name: str
age: Annotated[int, Metadata(default=0), Extra(ge=0)]
email: NotRequired[Annotated[str, Extra(min_length=5, max_length=100)]]
class Book(TypedDict):
author: NotRequired[User]
user: User = {"name": "John", "age": 30} # Type check, pass!
print(repr(user))
# Then use it in fastapi / index.py or other frameworks
UserModel = typeddict.to_pydantic(User)
print(repr(UserModel.__signature__))
print(repr(UserModel.parse_obj(user)))
book: Book = {"author": user} # Type check, pass!
print(repr(book))
# Then use it in fastapi / index.py or other frameworks
BookModel = typeddict.to_pydantic(Book)
print(repr(BookModel.__signature__))
print(repr(BookModel.parse_obj(book)))
cast
Sometimes you may not need a pydantic model, you can directly use typeddict to parse the data.
import typeddict
class User(TypedDict):
name: str
age: Annotated[int, Metadata(default=0), Extra(ge=0)]
email: NotRequired[Annotated[str, Extra(min_length=5, max_length=100)]]
user = typeddict.cast(User, {"name": "John", "age": 30, "unused-info": "....."})
print(repr(user))
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file typeddict-0.3.0.tar.gz
.
File metadata
- Download URL: typeddict-0.3.0.tar.gz
- Upload date:
- Size: 7.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.7.15 Linux/5.15.0-1030-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 41c10cf137a1df4d287aa147b1719f97ee465e46ec900ad483466c7c1b0692ed |
|
MD5 | b530dff81cd3071349660947435873b9 |
|
BLAKE2b-256 | ed92f941620967dd4ae6db22b303c34d06f19a258f01fa6b1b513f6e62f82f8e |
File details
Details for the file typeddict-0.3.0-py3-none-any.whl
.
File metadata
- Download URL: typeddict-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.7.15 Linux/5.15.0-1030-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e979ebf7455a7e95b82479df1e2eba00699e2566a68fef92cb5c2cebca663f27 |
|
MD5 | e3ef716d72c57efedd8532991eef7a0f |
|
BLAKE2b-256 | 2f10f5de15669213240596a80d691439ca94dc49223abb9b7b52f1a3a43c5a18 |