{"record":{"id":"6dbc66177ee46c94","repo":"pandas-dev/pandas","slug":"option-key-is-a-reserved-key","errorCode":null,"errorMessage":"Option '{key}' is a reserved key","messagePattern":"Option '(.+?)' is a reserved key","errorType":"exception","errorClass":"OptionError","httpStatus":null,"severity":"error","filePath":"pandas/_config/config.py","lineNumber":563,"sourceCode":"    cb\n        a function of a single argument \"key\", which is called\n        immediately after an option value is set/reset. key is\n        the full name of the option.\n\n    Raises\n    ------\n    ValueError if `validator` is specified and `defval` is not a valid value.\n\n    \"\"\"\n    import keyword\n    import tokenize\n\n    key = key.lower()\n\n    if key in _registered_options:\n        raise OptionError(f\"Option '{key}' has already been registered\")\n    if key in _reserved_keys:\n        raise OptionError(f\"Option '{key}' is a reserved key\")\n\n    # the default value should be legal\n    if validator:\n        validator(defval)\n\n    # walk the nested dict, creating dicts as needed along the path\n    path = key.split(\".\")\n\n    for k in path:\n        if not re.match(\"^\" + tokenize.Name + \"$\", k):\n            raise ValueError(f\"{k} is not a valid identifier\")\n        if keyword.iskeyword(k):\n            raise ValueError(f\"{k} is a python keyword\")\n\n    cursor = _global_config\n    msg = \"Path prefix to option '{option}' is already an option\"\n\n    for i, p in enumerate(path[:-1]):","sourceCodeStart":545,"sourceCodeEnd":581,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/_config/config.py#L545-L581","documentation":"Raised by `register_option` when the lowercased key is in `_reserved_keys`, which currently contains only `'all'`. Reserved keys have special meaning in the option API (e.g. `reset_option('all')`, `describe_option`) and cannot be registered.","triggerScenarios":"`register_option('all', ...)` (the only reserved key today).","commonSituations":"A library choosing a generic key name that happens to be reserved; future pandas versions adding more reserved keys that collide.","solutions":["Choose a different, non-reserved key name (ideally namespaced).","Avoid bare generic names like `all`; check `_reserved_keys` (`['all']`) before registering."],"exampleFix":"# before\nregister_option('all', True)   # OptionError: reserved key\n\n# after\nregister_option('mylib.all_enabled', True)","handlingStrategy":"validation","validationCode":"from pandas._config.config import _reserved_keys\ndef is_reserved(key: str) -> bool:\n    return key.lower() in _reserved_keys\nif not is_reserved(new_key):\n    register_option(new_key, default)","typeGuard":"def is_reserved_key(key: str) -> bool:\n    import pandas._config.config as c\n    return key.lower() in c._reserved_keys","tryCatchPattern":"from pandas._config.config import OptionError\ntry:\n    register_option(key, default)\nexcept OptionError as e:\n    if 'reserved key' in str(e):\n        # rename key and retry\n        ...\n    raise","preventionTips":["Avoid generic key names like `all`; namespace everything you register.","Read `_reserved_keys` when generating keys programmatically.","Keep your key namespace distinct from pandas built-ins."],"tags":["config","register-option","reserved","namespace"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}