Skip to content

Quick Start

from dataclasses import dataclass
from typing import Annotated
from annotated_types import DocInfo, Ge
from fields_metadata import MetadataExtractor, HumanReadableId

@dataclass
class Address:
    street: str
    city: str

@dataclass
class Person:
    name: Annotated[str, HumanReadableId(), DocInfo("Person's full name")]
    age: Annotated[int, Ge(0), DocInfo("Person's age in years")]
    email: str | None = None
    address: Address | None = None

extractor = MetadataExtractor()
metadata = extractor.extract(Person)

print(metadata["name"].doc)                   # "Person's full name"
print(metadata["name"].extra["human_readable_id"])  # True
print(metadata["age"].numeric)                # True
print(metadata["age"].extra["min_value"])     # 0
print(metadata["email"].optional)             # True

# Nested field
if "address.street" in metadata:
    street = metadata["address.street"]
    print(street.field_name)    # "street"
    print(street.parent_field)  # metadata["address"]

Next: Caching | Querying | Field Metadata