Reflection (Reference)¶
Models and classes provide built-in reflection helpers for runtime introspection.
__class_name__() -> str¶
Returns the type's name as a string.
model User:
name: str
def main() -> None:
u = User(name="Alice")
println(u.__class_name__()) # "User"
__fields__() -> FrozenList[FieldInfo]¶
Returns field metadata for the type.
model User:
name: str
email: str
def main() -> None:
u = User(name="Alice", email="alice@example.com")
for info in u.__fields__():
println(f"{info.name}: {info.type_name}")
FieldInfo structure¶
Each FieldInfo record contains:
| Field | Type | Description |
|---|---|---|
name |
FrozenStr |
Canonical Incan field identifier |
alias |
Option[FrozenStr] |
Wire name, if set via [alias="..."] |
description |
Option[FrozenStr] |
Documentation string, if set via [description="..."] |
wire_name |
FrozenStr |
Effective wire name (alias if present, else canonical name) |
type_name |
FrozenStr |
Incan type display (e.g. "str", "int", "Option[str]") |
has_default |
bool |
Whether the field has a default value |
extra |
FrozenDict[FrozenStr, FrozenStr] |
Reserved for future metadata; always empty in current version |
Notes:
- Field metadata like
[alias="..."]and[description="..."]is model-only. - For a
class,FieldInfo.aliasandFieldInfo.descriptionare alwaysNoneandFieldInfo.wire_name == FieldInfo.name.
Common patterns¶
If you only need canonical field names:
field_names = [f.name for f in model.__fields__()]
Check if a field exists:
has_email = any(f.name == "email" for f in user.__fields__())