Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

typeddict-0.3.0.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

typeddict-0.3.0-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

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

Hashes for typeddict-0.3.0.tar.gz
Algorithm Hash digest
SHA256 41c10cf137a1df4d287aa147b1719f97ee465e46ec900ad483466c7c1b0692ed
MD5 b530dff81cd3071349660947435873b9
BLAKE2b-256 ed92f941620967dd4ae6db22b303c34d06f19a258f01fa6b1b513f6e62f82f8e

See more details on using hashes here.

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

Hashes for typeddict-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e979ebf7455a7e95b82479df1e2eba00699e2566a68fef92cb5c2cebca663f27
MD5 e3ef716d72c57efedd8532991eef7a0f
BLAKE2b-256 2f10f5de15669213240596a80d691439ca94dc49223abb9b7b52f1a3a43c5a18

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page