{"record":{"id":"fa3472da500bc5fe","repo":"reflex-dev/reflex","slug":"function-for-generic-type-already-registered","errorCode":null,"errorMessage":"Function for {generic_type} already registered.","messagePattern":"Function for (.+?) already registered\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/vars/base.py","lineNumber":3373,"sourceCode":"    return_type = types[\"return\"]\n\n    origin = get_origin(return_type)\n\n    if origin is not Var:\n        msg = f\"Expected return type of {fn.__name__} to be a Var, got {origin}.\"\n        raise TypeError(msg)\n\n    generic_args = get_args(return_type)\n\n    if not generic_args:\n        msg = f\"Expected Var return type of {fn.__name__} to have a generic type.\"\n        raise TypeError(msg)\n\n    generic_type = get_origin(generic_args[0]) or generic_args[0]\n\n    if generic_type in dispatchers:\n        msg = f\"Function for {generic_type} already registered.\"\n        raise ValueError(msg)\n\n    dispatchers[generic_type] = fn\n\n    return fn\n\n\ndef dispatch(\n    field_name: str,\n    var_data: VarData,\n    result_var_type: GenericType,\n    existing_var: Var | None = None,\n) -> Var:\n    \"\"\"Dispatch a Var to the appropriate transformation function.\n\n    Args:\n        field_name: The name of the field.\n        var_data: The VarData associated with the Var.\n        result_var_type: The type of the Var.","sourceCodeStart":3355,"sourceCodeEnd":3391,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/vars/base.py#L3355-L3391","documentation":"The operator dispatcher table already contains a function for the given generic type, so registering a second one is rejected to keep dispatch unambiguous.","triggerScenarios":"Registering two dispatch functions whose return Var[T] generic type is the same (e.g. two functions returning Var[str]) in the same process.","commonSituations":"A module registering a custom operator gets imported twice with different definitions, or a user re-registers an operator reflex already provides (e.g. adding another Var[str] formatter).","solutions":["Check dispatchers for the existing registration and extend that function instead of adding a new one","Give the new function a distinct generic return type or rename/reuse the existing entry","Guard registration with an `if generic_type not in dispatchers` check in test/dev code"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from typing import get_origin, get_args\nkey = get_origin(get_args(fn.__annotations__['return'])[0]) or get_args(fn.__annotations__['return'])[0]\nif key in dispatchers:\n    # extend existing dispatcher instead of re-registering\n    ...","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register each generic type's handler exactly once per process","Avoid re-importing registration modules under different names"],"tags":["reflex","operator-dispatch","duplicate-registration"],"backgroundTag":"duplicate-handler-registration","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}