{"record":{"id":"589c180ac6ad6a18","repo":"donnemartin/interactive-coding-challenges","slug":"data-cannot-be-none","errorCode":null,"errorMessage":"data cannot be None","messagePattern":"data cannot be None","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"graphs_trees/bst/bst.py","lineNumber":20,"sourceCode":"\n    def __init__(self, data):\n        self.data = data\n        self.left = None\n        self.right = None\n        self.parent = None\n\n    def __repr__(self):\n        return str(self.data)\n\n\nclass Bst(object):\n\n    def __init__(self, root=None):\n        self.root = root\n\n    def insert(self, data):\n        if data is None:\n            raise TypeError('data cannot be None')\n        if self.root is None:\n            self.root = Node(data)\n            return self.root\n        else:\n            return self._insert(self.root, data)\n\n    def _insert(self, node, data):\n        if node is None:\n            return Node(data)\n        if data <= node.data:\n            if node.left is None:\n                node.left = self._insert(node.left, data)\n                node.left.parent = node\n                return node.left\n            else:\n                return self._insert(node.left, data)\n        else:\n            if node.right is None:","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/donnemartin/interactive-coding-challenges/blob/358f2cc60426d5c4c3d7d580910eec9a7b393fa9/graphs_trees/bst/bst.py#L2-L38","documentation":"Raised by Bst.insert when data is None. The BST uses None internally to mark an empty tree (self.root is None), so a None data value would corrupt tree invariants. It indicates a caller passed an unset or missing value.","triggerScenarios":"Calling bst.insert(None), or feeding insert from data that was not filtered for missing values (e.g. dict.get() returning None).","commonSituations":"Loading datasets with nulls from CSV/DB and inserting without cleaning; passing optional variables that were never set.","solutions":["Filter out None values before calling insert","Find where the None originates (unset variable, dict.get default) and supply a real value","Represent 'missing' with a wrapper or sentinel object instead of None if needed"],"exampleFix":"# before\nbst.insert(data.get('value'))  # may be None\n\n# after\nvalue = data.get('value')\nif value is not None:\n    bst.insert(value)","handlingStrategy":"validation","validationCode":"if data is None:\n    raise ValueError('missing data, skipping insert')\nbst.insert(data)","typeGuard":"def is_insertable(value) -> bool:\n    return value is not None","tryCatchPattern":"try:\n    bst.insert(data)\nexcept TypeError as e:\n    if 'cannot be None' in str(e):\n        # skip or log the bad record\n        pass\n    else:\n        raise","preventionTips":["Filter None from input data before tree operations","Never rely on dict.get() results without a None check when feeding insert"],"tags":["binary-search-tree","none-check","typeerror","validation"],"backgroundTag":"none-argument-rejected","analyzedSha":"358f2cc60426d5c4c3d7d580910eec9a7b393fa9","analyzedAt":"2026-08-28T10:16:54.480Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}