reflex-dev/reflex · error · EventHandlerTypeError

Event handler {self.fn.__name__} received extra argument {ex

Error message

Event handler {self.fn.__name__} received extra argument {extra_arg}.

What it means

The EventHandler __call__ validates that every keyword argument matches a declared parameter of the wrapped function; an unrecognized keyword means the event payload would reference a parameter the state function does not accept.

Source

Thrown at packages/reflex-base/src/reflex_base/event/__init__.py:642

        if not isinstance(
            repeated_arg := next(
                (kwarg for kwarg in kwargs if kwarg in fn_args[: len(args)]), Unset()
            ),
            Unset,
        ):
            msg = f"Event handler {self.fn.__name__} received repeated argument {repeated_arg}."
            raise EventHandlerTypeError(msg)

        if not isinstance(
            extra_arg := next(
                (kwarg for kwarg in kwargs if kwarg not in fn_args), Unset()
            ),
            Unset,
        ):
            msg = (
                f"Event handler {self.fn.__name__} received extra argument {extra_arg}."
            )
            raise EventHandlerTypeError(msg)

        fn_args = fn_args[: len(args)] + list(kwargs)
        event_args = [*args, *kwargs.values()]

        # Construct the payload.
        payload = []
        upload_event_spec = None
        for fn_arg, arg in zip(fn_args, event_args, strict=False):
            # Special case for file uploads. The upload arg takes its own
            # positional slot so the remaining args stay aligned with fn_args,
            # but its parameter name is re-derived server-side in as_event_spec.
            if isinstance(arg, (FileUpload, UploadFilesChunk)):
                if upload_event_spec is not None:
                    msg = (
                        f"Event handler {self.fn.__name__} received multiple file "
                        "upload arguments."
                    )
                    raise EventHandlerTypeError(msg)

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Fix the keyword name to match a declared parameter of the handler
  2. Add the parameter to the handler signature if the argument is genuinely needed
  3. Remove the argument entirely if it was passed by mistake

Example fix

# before
State.set_name(username='bob')  # handler is def set_name(self, name):
# after
State.set_name(name='bob')
Defensive patterns

Strategy: type-guard

Validate before calling

import inspect

def valid_kwargs(fn, **kwargs) -> bool:
    params = inspect.signature(fn).parameters
    return all(k in params for k in kwargs) or any(p.kind is p.VAR_KEYWORD for p in params.values())

Type guard

def handler_accepts_kwargs(fn, kwargs) -> TypeGuard[Callable]: return set(kwargs) <= set(inspect.signature(fn).parameters)

Prevention

When it happens

Trigger: Calling State.some_event(foo=...) where the handler signature has no parameter named foo (no **kwargs catch-all either).

Common situations: Typos in keyword names, stale keyword after renaming handler params, or passing options meant for a different event trigger.

Related errors


AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28). Data as JSON: /api/errors/8edf10f8f617fe95. Report an issue: GitHub.