{"id":"067b4d03b1ba5e9c","repo":"celery/celery","slug":"key-not-found-in-first-mapping-key-r","errorCode":null,"errorMessage":"Key not found in first mapping: {key!r}","messagePattern":"Key not found in first mapping: (.+?)","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"celery/utils/collections.py","lineNumber":263,"sourceCode":"        # type: (Any) -> Any\n        _key = self._key(key)\n        for mapping in self.maps:\n            try:\n                return mapping[_key]\n            except KeyError:\n                pass\n        return self.__missing__(key)\n\n    def __setitem__(self, key, value):\n        # type: (Any, Any) -> None\n        self.changes[self._key(key)] = value\n\n    def __delitem__(self, key):\n        # type: (Any) -> None\n        try:\n            del self.changes[self._key(key)]\n        except KeyError:\n            raise KeyError(f'Key not found in first mapping: {key!r}')\n\n    def clear(self):\n        # type: () -> None\n        self.changes.clear()\n\n    def get(self, key, default=None):\n        # type: (Any, Any) -> Any\n        try:\n            return self[self._key(key)]\n        except KeyError:\n            return default\n\n    def __len__(self):\n        # type: () -> int\n        return len(set().union(*self.maps))\n\n    def __iter__(self):\n        return self._iterate_keys()","sourceCodeStart":245,"sourceCodeEnd":281,"githubUrl":"https://github.com/celery/celery/blob/571efe81202341310b6257304980ba7898ab0f60/celery/utils/collections.py#L245-L281","documentation":"Raised by ChainMap.__delitem__ (collections.py:263) when you try to delete a key that is not present in the first mapping (the 'changes' layer). Celery's ChainMap only allows deletion of keys that live in the overrides map, since defaults layers are considered read-only. The error explicitly names 'first mapping' to point you at the changes dict.","triggerScenarios":"Calling del conf['SOME_KEY'] or chainmap.pop-related deletion when the key exists only in a defaults layer, or doesn't exist at all. Also triggered by ConfigurationView.__delitem__ falling through to ChainMap when the key was never set in changes.","commonSituations":"Attempting to 'unset' a setting that came from celery defaults or a config_from_object module rather than from runtime overrides. Cleanup code that assumes a key was previously set during a test.","solutions":["Check 'KEY' in the changes/overrides layer before deleting, or use pop(key, None) semantics.","Re-set the key to its default value instead of deleting it if it lives in defaults.","Confirm the key actually lives in app.conf (the changes view) with 'KEY' in app.conf before del."],"exampleFix":"# before\ndel app.conf['task_serializer']\n\n# after\nif 'task_serializer' in app.conf:\n    del app.conf['task_serializer']","handlingStrategy":"validation","validationCode":"if key in conf.changes:\n    del conf[key]","typeGuard":"def key_in_changes(conf, key: str) -> bool:\n    return key in conf.changes","tryCatchPattern":"try:\n    del conf[key]\nexcept KeyError as e:\n    pass  # already absent","preventionTips":["Only delete keys you previously set in the changes layer.","Use conf.pop(key, None) semantics where available.","Reset a defaults-layer key to its default value instead of deleting it."],"tags":["configuration","collections","chainmap","deletion"],"analyzedSha":"571efe81202341310b6257304980ba7898ab0f60","analyzedAt":"2026-08-04T20:17:20.567Z","schemaVersion":2}