Skip to content

Commit

Permalink
convert event return types to type hints (#4331)
Browse files Browse the repository at this point in the history
  • Loading branch information
adhami3310 authored Nov 8, 2024
1 parent 2ee2d52 commit 4c4c59b
Showing 1 changed file with 37 additions and 1 deletion.
38 changes: 37 additions & 1 deletion reflex/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import json
import pickle
import sys
import typing
import uuid
from abc import ABC, abstractmethod
from collections import defaultdict
Expand Down Expand Up @@ -90,7 +91,13 @@
)
from reflex.utils.exec import is_testing_env
from reflex.utils.serializers import serializer
from reflex.utils.types import _isinstance, get_origin, override
from reflex.utils.types import (
_isinstance,
get_origin,
is_union,
override,
value_inside_optional,
)
from reflex.vars import VarData

if TYPE_CHECKING:
Expand Down Expand Up @@ -1713,6 +1720,35 @@ async def _process_event(
# Get the function to process the event.
fn = functools.partial(handler.fn, state)

try:
type_hints = typing.get_type_hints(handler.fn)
except Exception:
type_hints = {}

for arg, value in list(payload.items()):
hinted_args = type_hints.get(arg, Any)
if hinted_args is Any:
continue
if is_union(hinted_args):
if value is None:
continue
hinted_args = value_inside_optional(hinted_args)
if (
isinstance(value, dict)
and inspect.isclass(hinted_args)
and (
dataclasses.is_dataclass(hinted_args)
or issubclass(hinted_args, Base)
)
):
payload[arg] = hinted_args(**value)
if isinstance(value, list) and (hinted_args is set or hinted_args is Set):
payload[arg] = set(value)
if isinstance(value, list) and (
hinted_args is tuple or hinted_args is Tuple
):
payload[arg] = tuple(value)

# Wrap the function in a try/except block.
try:
# Handle async functions.
Expand Down

0 comments on commit 4c4c59b

Please sign in to comment.