I'm trying to create a sorted dict class as a way to mess around with dunder methods. I know collections.OrderedDict exists.
When I try to overload __getitem__ or __setitem__, Python acts as if I am trying to index a list with a string key. Here is my code for the class:
class SortedDict: def __init__(self, **kwargs): self.map = dict(kwargs) self._sort() def __str__(self): return str(self.map) def __getitem__(self, key): return self.map[key] def __setitem__(self, name, value): self.map[name] = value def keys(self): return self.map.keys() def add(self, **kwargs): for key in kwargs: self.map[key] = kwargs[key] self._sort() indices = dict() for key in kwargs.keys(): indices[key] = self.index(key) return indices def remove(self, *args): for key in args: self.map.pop(key) def index(self, key: str): keys = list() for dict_key in self.map.keys(): keys.append(dict_key) return keys.index(key) def contains(self, key: str): return key in self.map def _sort(self): self.map = sorted(self.map)When I execute the following code to test __getitem__:
from sorted_dict import SortedDicttest_dict= SortedDict(test1=1, test2=2, a=2, b=3)print(test_dict['test1'])I get this error:
Traceback (most recent call last): File "c:\Users\Chris\Desktop\Code\DMC2\mapping_editor\tree.py", line 16, in <module> print(test_dict['test1']) File "c:\Users\Chris\Desktop\Code\DMC2\mapping_editor\sorted_dict.py", line 11, in __getitem__ return self.map[key]TypeError: list indices must be integers or slices, not strI get a similar error when trying to use __setitem__. I am using VS code, and when I hover my cursor over self.map in either of those functions the type is shown as dict[str, Any] | list[str]. If I print the type of self.map in either of the functions, it prints <class 'list'>, but when I print the class of self.map in the constructor it prints as <class 'dict'>, which is what I would expect. When I print self.map in the __setitem__ or __getitem__ functions it prints as a list of the keys, but in the constructor it prints as a dictionary would. What am I missing?