{"record":{"id":"6ee6092e5aecf5ce","repo":"donnemartin/interactive-coding-challenges","slug":"matrices-cannot-be-none","errorCode":null,"errorMessage":"matrices cannot be None","messagePattern":"matrices cannot be None","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"recursion_dynamic/matrix_mult/find_min_cost_solution.ipynb","lineNumber":200,"sourceCode":"    \"    def __init__(self, first, second):\\n\",\n    \"        self.first = first\\n\",\n    \"        self.second = second\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sys\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class MatrixMultiplicationCost(object):\\n\",\n    \"\\n\",\n    \"    def find_min_cost(self, matrices):\\n\",\n    \"        if matrices is None:\\n\",\n    \"            raise TypeError('matrices cannot be None')\\n\",\n    \"        if not matrices:\\n\",\n    \"            return 0\\n\",\n    \"        size = len(matrices)\\n\",\n    \"        T = [[0] * size for _ in range(size)]\\n\",\n    \"        for offset in range(1, size):\\n\",\n    \"            for i in range(size-offset):\\n\",\n    \"                j = i + offset\\n\",\n    \"                min_cost = sys.maxsize\\n\",\n    \"                for k in range(i, j):\\n\",\n    \"                    cost = (T[i][k] + T[k+1][j] +\\n\",\n    \"                            matrices[i].first *\\n\",\n    \"                            matrices[k].second *\\n\",\n    \"                            matrices[j].second)\\n\",\n    \"                    if cost < min_cost:\\n\",\n    \"                        min_cost = cost\\n\",\n    \"                T[i][j] = min_cost\\n\",\n    \"        return T[0][size-1]\"\n   ]","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/donnemartin/interactive-coding-challenges/blob/358f2cc60426d5c4c3d7d580910eec9a7b393fa9/recursion_dynamic/matrix_mult/find_min_cost_solution.ipynb#L182-L218","documentation":"Raised by MatrixMultiplicationCost.find_min_cost when matrices is None. The method builds a square DP table of size len(matrices) and reads matrix dimensions from each entry, so a None list is rejected explicitly before T is allocated.","triggerScenarios":"Calling find_min_cost(None). An empty list is valid and returns 0; only None raises the TypeError.","commonSituations":"Matrix dimension chains parsed from input that may be absent; a chain-building helper returning None on parse failure; passing an uninitialized variable.","solutions":["Pass a list of matrix dimension tuples (e.g. [(2,3),(3,6)]) and default to [] when absent","Fix the parser to return [] on failure instead of None","Guard the call site with 'if matrices is not None'"],"exampleFix":"// before\ncost = mmc.find_min_cost(parse_dims(text))\n// after\ndims = parse_dims(text) or []\ncost = mmc.find_min_cost(dims)","handlingStrategy":"validation","validationCode":"matrices = matrices or []\nmmc.find_min_cost(matrices)","typeGuard":"def is_dim_list(x):\n    return isinstance(x, list) and all(isinstance(m, tuple) and len(m) == 2 for m in x)","tryCatchPattern":"try:\n    mmc.find_min_cost(matrices)\nexcept TypeError:\n    cost = 0","preventionTips":["Parsers should return [] on failure","Validate dimension tuples at parse time"],"tags":["python","dynamic-programming","matrix-chain","input-validation"],"backgroundTag":"none-argument-validation","analyzedSha":"358f2cc60426d5c4c3d7d580910eec9a7b393fa9","analyzedAt":"2026-08-28T10:16:54.480Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}