{"record":{"id":"8edf10f8f617fe95","repo":"reflex-dev/reflex","slug":"event-handler-self-fn-name-received-extra-ar","errorCode":null,"errorMessage":"Event handler {self.fn.__name__} received extra argument {extra_arg}.","messagePattern":"Event handler (.+?) received extra argument (.+?)\\.","errorType":"exception","errorClass":"EventHandlerTypeError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/event/__init__.py","lineNumber":642,"sourceCode":"        if not isinstance(\n            repeated_arg := next(\n                (kwarg for kwarg in kwargs if kwarg in fn_args[: len(args)]), Unset()\n            ),\n            Unset,\n        ):\n            msg = f\"Event handler {self.fn.__name__} received repeated argument {repeated_arg}.\"\n            raise EventHandlerTypeError(msg)\n\n        if not isinstance(\n            extra_arg := next(\n                (kwarg for kwarg in kwargs if kwarg not in fn_args), Unset()\n            ),\n            Unset,\n        ):\n            msg = (\n                f\"Event handler {self.fn.__name__} received extra argument {extra_arg}.\"\n            )\n            raise EventHandlerTypeError(msg)\n\n        fn_args = fn_args[: len(args)] + list(kwargs)\n        event_args = [*args, *kwargs.values()]\n\n        # Construct the payload.\n        payload = []\n        upload_event_spec = None\n        for fn_arg, arg in zip(fn_args, event_args, strict=False):\n            # Special case for file uploads. The upload arg takes its own\n            # positional slot so the remaining args stay aligned with fn_args,\n            # but its parameter name is re-derived server-side in as_event_spec.\n            if isinstance(arg, (FileUpload, UploadFilesChunk)):\n                if upload_event_spec is not None:\n                    msg = (\n                        f\"Event handler {self.fn.__name__} received multiple file \"\n                        \"upload arguments.\"\n                    )\n                    raise EventHandlerTypeError(msg)","sourceCodeStart":624,"sourceCodeEnd":660,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/event/__init__.py#L624-L660","documentation":"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.","triggerScenarios":"Calling State.some_event(foo=...) where the handler signature has no parameter named foo (no **kwargs catch-all either).","commonSituations":"Typos in keyword names, stale keyword after renaming handler params, or passing options meant for a different event trigger.","solutions":["Fix the keyword name to match a declared parameter of the handler","Add the parameter to the handler signature if the argument is genuinely needed","Remove the argument entirely if it was passed by mistake"],"exampleFix":"# before\nState.set_name(username='bob')  # handler is def set_name(self, name):\n# after\nState.set_name(name='bob')","handlingStrategy":"type-guard","validationCode":"import inspect\n\ndef valid_kwargs(fn, **kwargs) -> bool:\n    params = inspect.signature(fn).parameters\n    return all(k in params for k in kwargs) or any(p.kind is p.VAR_KEYWORD for p in params.values())","typeGuard":"def handler_accepts_kwargs(fn, kwargs) -> TypeGuard[Callable]: return set(kwargs) <= set(inspect.signature(fn).parameters)","tryCatchPattern":null,"preventionTips":["Use IDE autocomplete on state method signatures","Keep handler param names stable and covered by tests"],"tags":["reflex","event-handler","argument-error","typo"],"backgroundTag":"unexpected-keyword-argument","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}