reflex-dev/reflex · error · EventHandlerTypeError

Event handler {self.fn.__name__} received repeated argument

Error message

Event handler {self.fn.__name__} received repeated argument {repeated_arg}.

What it means

When calling an event handler (e.g. State.my_event(arg1, arg2)) the framework builds the event payload and detects that the same parameter was supplied twice — once positionally and once as a keyword.

Source

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

            EventHandlerTypeError: If the arguments are invalid.
        """
        from reflex_base.utils.exceptions import EventHandlerTypeError

        # Get the function args.
        if self.state is not None:
            # Skip the `self` arg for state-bound event handlers.
            fn_args = list(self._parameters)[1:]
        else:
            fn_args = list(self._parameters)

        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

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Pass each argument only once — use either positional or keyword for a given parameter
  2. Rename the keyword argument to match a different parameter or remove the redundant one

Example fix

# before
rx.button('Go', on_click=State.set_values(1, a=2))
# after
rx.button('Go', on_click=State.set_values(1, 2))
Defensive patterns

Strategy: validation

Validate before calling

import inspect

def check_no_repeat(fn, *args, **kwargs):
    params = list(inspect.signature(fn).parameters)
    covered = params[:len(args)]
    dup = [k for k in kwargs if k in covered]
    assert not dup, f'repeated args: {dup}'

Try / catch

try:
    spec = State.my_event(1, a=2)
except EventHandlerTypeError as e:
    # log and fix call site
    raise

Prevention

When it happens

Trigger: Invoking an EventHandler with a positional argument followed by a keyword naming a parameter already covered positionally, e.g. state.handle(1, b=2) where handle(self, a, b) and the positional slot already maps to b, or duplicate kwargs colliding after positional mapping.

Common situations: Copy-pasting event triggers in component props and mixing positional/keyword styles; refactoring a handler signature so an old keyword now overlaps a positional arg.

Related errors


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