{"record":{"id":"56f329d791018584","repo":"mission-peace/interview","slug":"pop-from-an-empty-priority-queue","errorCode":null,"errorMessage":"pop from an empty priority queue","messagePattern":"pop from an empty priority queue","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"warning","filePath":"python/graph/priorityqueue.py","lineNumber":53,"sourceCode":"    def change_task_priority(self, priority, task):\n        if task not in self.entry_finder:\n            raise KeyError(\"Task not found\")\n        self.remove_task(task)\n        entry = [self.mul*priority, False, task]\n        self.entry_finder[task] = entry\n        heappush(self.pq, entry)\n \n    def remove_task(self, task):\n        entry = self.entry_finder.pop(task)\n        entry[1] = True\n\n    def pop_task(self):\n        while self.pq:\n            priority, removed, task = heappop(self.pq)\n            if removed is False:\n                del self.entry_finder[task]\n                return task\n        raise KeyError(\"pop from an empty priority queue\")\n\n    def peek_task(self):\n        while self.pq:\n            priority, removed, task = tuple(heappop(self.pq))\n            if removed is False:\n                 heappush(self.pq, [priority, False, task])\n                 return task\n        raise KeyError(\"pop from an empty priority queue\")\n\n    def is_empty(self):\n        try:\n            self.peek_task()\n            return False\n        except KeyError:\n            return True\n\n    def __str__(self):\n        return str(self.entry_finder) + \" \" + str(self.pq)","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/mission-peace/interview/blob/94be5deb0c0df30ade2a569cf3056b7cc1e012f4/python/graph/priorityqueue.py#L35-L71","documentation":"pop_task drains stale (removed-flagged) heap entries; if the heap ends up empty with no live task it raises KeyError(\"pop from an empty priority queue\"). This signals a dequeue attempt when no tasks remain.","triggerScenarios":"Calling pop_task() on a queue with no pending tasks, or where all entries were invalidated via remove_task.","commonSituations":"Worker loops that poll without checking emptiness, race where another consumer drained the queue, or draining after processing completed.","solutions":["Check pq.is_empty() before popping","Catch KeyError around pop_task in consumer loops and treat as 'queue empty'","Use a sentinel/blocking mechanism for wait-until-available semantics"],"exampleFix":"// before\ntask = pq.pop_task()\n// after\ntry:\n    task = pq.pop_task()\nexcept KeyError:\n    task = None","handlingStrategy":"try-catch","validationCode":"if pq.entry_finder:\n    task = pq.pop_task()","typeGuard":null,"tryCatchPattern":"try:\n    task = pq.pop_task()\nexcept KeyError:\n    task = None  # queue empty","preventionTips":["Guard consumer loops with is_empty() or KeyError catch","Synchronize producers/consumers if multiple threads drain the queue","Never assume a task is pending without checking entry_finder"],"tags":["python","priority-queue","empty-collection"],"backgroundTag":"empty-result-set","analyzedSha":"94be5deb0c0df30ade2a569cf3056b7cc1e012f4","analyzedAt":"2026-09-08T13:27:05.954Z","contentChangedAt":"2026-09-08T13:27:05.954Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}