{"record":{"id":"66a40a0c8934e66e","repo":"pola-rs/polars","slug":"extension-type-ext-name-is-already-registered","errorCode":null,"errorMessage":"extension type '{ext_name}' is already registered","messagePattern":"extension type '(.+?)' is already registered","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/datatypes/extension.py","lineNumber":30,"sourceCode":"\n\n@unstable()\ndef register_extension_type(\n    ext_name: str,\n    ext_class: type[dt.BaseExtension] | None = None,\n    *,\n    as_storage: bool = False,\n) -> None:\n    \"\"\"\n    Register the extension type for the given extension name.\n\n    .. warning::\n        This functionality is currently considered **unstable**. It may be\n        changed at any point without it being considered a breaking change.\n    \"\"\"\n    if \"ext_name\" in _REGISTRY:\n        msg = f\"extension type '{ext_name}' is already registered\"\n        raise ValueError(msg)\n\n    if as_storage:\n        assert ext_class is None, \"cannot specify ext_class when as_storage is True\"\n        _REGISTRY[ext_name] = \"storage\"\n        with contextlib.suppress(NameError):  # _plr module may be unavailable\n            _register_extension_type(ext_name, None)\n    else:\n        assert not as_storage, \"as_storage must be False when ext_class is provided\"\n        assert isinstance(ext_class, type)\n        assert issubclass(ext_class, dt.BaseExtension)\n        _REGISTRY[ext_name] = ext_class\n        with contextlib.suppress(NameError):  # _plr module may be unavailable\n            _register_extension_type(ext_name, ext_class)\n\n\n@unstable()\ndef unregister_extension_type(ext_name: str) -> None:\n    \"\"\"","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/datatypes/extension.py#L12-L48","documentation":"polars' extension-type registry is process-global, and register_extension_type refuses duplicate names: registering an ext_name already present in _REGISTRY raises ValueError. A second registration of the same name — even from re-imported or re-executed code — trips it.","triggerScenarios":"Calling polars.datatypes.extension.register_extension_type('my_ext', ...) twice in one process: re-running a notebook registration cell, importlib.reload of a module that registers at import time, or a library registered from two code paths.","commonSituations":"Jupyter workflows with re-executed cells or %autoreload; test suites that register per-test without teardown; plugins that register on import and get imported twice via different paths.","solutions":["Unregister first: polars.datatypes.extension.unregister_extension_type('my_ext'), then re-register","Register once at module import and never re-run that code; in notebooks, guard the cell or track registration state","In tests, use a fixture that unregisters in teardown (try/finally) so each test starts clean"],"exampleFix":"# before\nregister_extension_type('my_ext', MyExtDtype)  # second call: ValueError\n\n# after\nfrom polars.datatypes.extension import register_extension_type, unregister_extension_type\ntry:\n    unregister_extension_type('my_ext')\nexcept Exception:\n    pass\nregister_extension_type('my_ext', MyExtDtype)","handlingStrategy":"validation","validationCode":"from polars.datatypes.extension import register_extension_type, unregister_extension_type\n\ndef register_once(ext_name: str, ext_class=None, **kw) -> None:\n    try:\n        unregister_extension_type(ext_name)\n    except Exception:\n        pass  # not registered yet\n    register_extension_type(ext_name, ext_class, **kw)\n\nregister_once('my_ext', MyExtDtype)","typeGuard":null,"tryCatchPattern":"from polars.datatypes.extension import register_extension_type\n\ntry:\n    register_extension_type('my_ext', MyExtDtype)\nexcept ValueError as e:\n    if 'already registered' in str(e):\n        pass  # idempotent: already set up in this process\n    else:\n        raise","preventionTips":["Register extension types once at module import; never inside functions called repeatedly","In notebooks, keep registration in a single cell and avoid re-running it","In tests, unregister in teardown fixtures so each test starts clean"],"tags":["extension","registry","duplicate-registration","notebook"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}