{"record":{"id":"70d1b28adcd64419","repo":"reflex-dev/reflex","slug":"rx-memo-does-not-support-args-in-fn-name","errorCode":null,"errorMessage":"`@rx.memo` does not support `*args` in `{fn_name}`.","messagePattern":"`@rx\\.memo` does not support `\\*args` in `(.+?)`\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/components/memo.py","lineNumber":1359,"sourceCode":"        )\n\n    return tuple(params)\n\n\ndef _check_parameter_kind(parameter: inspect.Parameter, fn_name: str) -> None:\n    \"\"\"Reject Python parameter kinds (``*args`` / ``**kwargs`` / positional-only)\n    that memo does not support.\n\n    Args:\n        parameter: The parameter to check.\n        fn_name: The function name for error messages.\n\n    Raises:\n        TypeError: If the parameter uses an unsupported kind.\n    \"\"\"\n    if parameter.kind is inspect.Parameter.VAR_POSITIONAL:\n        msg = f\"`@rx.memo` does not support `*args` in `{fn_name}`.\"\n        raise TypeError(msg)\n    if parameter.kind is inspect.Parameter.VAR_KEYWORD:\n        msg = f\"`@rx.memo` does not support `**kwargs` in `{fn_name}`.\"\n        raise TypeError(msg)\n    if parameter.kind is inspect.Parameter.POSITIONAL_ONLY:\n        msg = f\"`@rx.memo` does not support positional-only parameters in `{fn_name}`.\"\n        raise TypeError(msg)\n\n\ndef _classify_parameter(\n    annotation: Any, param_name: str, fn_name: str\n) -> tuple[MemoParamKind, Any]:\n    \"\"\"Walk ``_CLASSIFICATION_ORDER`` and return the first matching kind.\n\n    Args:\n        annotation: The parameter annotation.\n        param_name: The parameter name (some kinds care, e.g. ``children``).\n        fn_name: The function name for error messages.\n","sourceCodeStart":1341,"sourceCodeEnd":1377,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/components/memo.py#L1341-L1377","documentation":"`@rx.memo` inspects the wrapped function's signature and rejects `*args` (VAR_POSITIONAL) parameters. Memoized component functions must have a fully explicit signature so Reflex can statically map each parameter to a typed prop at compile time; variadic positional arguments cannot be classified as props.","triggerScenarios":"Decorating a function with `@rx.memo` where the signature contains `*args`, e.g. `@rx.memo def item(*args): ...`. The error is raised eagerly at decoration time by `_analyze_params` -> `_check_parameter_kind`.","commonSituations":"Copying a plain Python helper that used `*args` into a memoized component; refactoring a render function to accept flexible arguments; converting a wrapper/decorator-style function to `@rx.memo`.","solutions":["Remove `*args` and declare each prop explicitly with `rx.Var[...]` annotations, e.g. `def item(label: rx.Var[str], count: rx.Var[int])`.","If you need a variable set of props, declare a single `rx.RestProp` parameter instead of `*args`.","Keep variadic-argument helpers as plain functions outside `@rx.memo` and pass their result in as an explicit prop."],"exampleFix":"// before\n@rx.memo\ndef item(*args):\n    return rx.box(*args)\n\n# after\n@rx.memo\ndef item(a: rx.Var[str], b: rx.Var[str]):\n    return rx.box(a, b)","handlingStrategy":"validation","validationCode":"import inspect\n\ndef memo_signature_ok(fn) -> bool:\n    for p in inspect.signature(fn).parameters.values():\n        if p.kind is inspect.Parameter.VAR_POSITIONAL:\n            return False\n    return True\n\nassert memo_signature_ok(item), \"remove *args before applying @rx.memo\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always annotate every memo parameter explicitly; never use *args or **kwargs in @rx.memo functions.","Use rx.RestProp when you need flexible extra props.","Add a lint/test that reflects over memo functions to assert signatures are explicit."],"tags":["reflex","memo","signature","args","typeerror"],"backgroundTag":"unsupported-function-signature","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}