reflex-dev/reflex · error · TypeError

`@rx.memo` does not support `**kwargs` in `{fn_name}`.

Error message

`@rx.memo` does not support `**kwargs` in `{fn_name}`.

What it means

`@rx.memo` rejects `**kwargs` (VAR_KEYWORD) parameters because it needs a static, known set of props to generate the compiled component definition. Arbitrary keyword arguments cannot be mapped to typed props or rest props.

Source

Thrown at packages/reflex-base/src/reflex_base/components/memo.py:1362


def _check_parameter_kind(parameter: inspect.Parameter, fn_name: str) -> None:
    """Reject Python parameter kinds (``*args`` / ``**kwargs`` / positional-only)
    that memo does not support.

    Args:
        parameter: The parameter to check.
        fn_name: The function name for error messages.

    Raises:
        TypeError: If the parameter uses an unsupported kind.
    """
    if parameter.kind is inspect.Parameter.VAR_POSITIONAL:
        msg = f"`@rx.memo` does not support `*args` in `{fn_name}`."
        raise TypeError(msg)
    if parameter.kind is inspect.Parameter.VAR_KEYWORD:
        msg = f"`@rx.memo` does not support `**kwargs` in `{fn_name}`."
        raise TypeError(msg)
    if parameter.kind is inspect.Parameter.POSITIONAL_ONLY:
        msg = f"`@rx.memo` does not support positional-only parameters in `{fn_name}`."
        raise TypeError(msg)


def _classify_parameter(
    annotation: Any, param_name: str, fn_name: str
) -> tuple[MemoParamKind, Any]:
    """Walk ``_CLASSIFICATION_ORDER`` and return the first matching kind.

    Args:
        annotation: The parameter annotation.
        param_name: The parameter name (some kinds care, e.g. ``children``).
        fn_name: The function name for error messages.

    Returns:
        The matched ``(kind, kind_data)``.

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Replace `**kwargs` with an `rx.RestProp` parameter, which is the supported way to capture extra props in a memo.
  2. Declare every prop you actually pass explicitly with `rx.Var[...]` annotations.
  3. Drop `**kwargs` entirely if all inputs are known.

Example fix

# before
@rx.memo
def card(title: rx.Var[str], **kwargs):
    ...

# after
@rx.memo
def card(title: rx.Var[str], extra: rx.RestProp):
    ...
Defensive patterns

Strategy: validation

Validate before calling

import inspect

def memo_signature_ok(fn) -> bool:
    return all(
        p.kind is not inspect.Parameter.VAR_KEYWORD
        for p in inspect.signature(fn).parameters.values()
    )

Prevention

When it happens

Trigger: Decorating a function with `@rx.memo` whose signature includes `**kwargs`, e.g. `@rx.memo def card(title: rx.Var[str], **kwargs): ...`. Raised at decoration time during parameter analysis.

Common situations: Porting a component factory that accepted flexible props via `**kwargs`; combining a typed prop list with a catch-all for extras; generated code that appends `**kwargs` for forward compatibility.

Related errors


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