I create a CustomDict, which has flip functionality,
class CustomDict(dict):
def flip(self):
import collections.abc
copy = {}
for key, value in self.items():
if(isinstance(value, collections.abc.Hashable)):
copy[value] = key
else:
raise TypeError(f'unhashable type {type(value)} for {value}')
self = copy
return self
x = CustomDict({'a': 1, 'b': 2})
x.flip()
gives,
{1: 'a', 2: 'b'}
then, I use a modified form of dir
on it,
passed = defaultdict(lambda : defaultdict(set))
failed = defaultdict(set)
combined = {'x': x}
for key, value in combined.items():
for j in dir(value):
try:
qualname = eval(f'{key}.{j}.__qualname__')
qualname = qualname.split('.')
passed[key][qualname[0]].add(qualname[1])
except:
failed[key].add(j)
I get passed
as,
defaultdict(<function <lambda> at 0x7f18d0c35170>,
{'x': defaultdict(<class 'set'>,
{'CustomDict': {'__contains__', '__dir__',
'__format__', '__getitem__',
'__init_subclass__', '__reduce__',
'__reduce_ex__', '__sizeof__',
'__subclasshook__', 'clear',
'copy', 'flip', 'fromkeys', 'get',
'items', 'keys', 'pop', 'popitem',
'setdefault', 'update',
'values'},
'dict': {'__delitem__', '__eq__', '__ge__',
'__getattribute__', '__gt__',
'__init__', '__iter__', '__le__',
'__len__', '__lt__', '__ne__',
'__new__', '__repr__', '__setitem__'},
'object': {'__delattr__', '__setattr__',
'__str__'}})})
when I do a similar check on a dict
d = {'a': 1, 'b': 2}
combined = {'d': d}
passed
gives,
defaultdict(<function <lambda> at 0x7f18d0c35d40>,
{'d': defaultdict(<class 'set'>,
{'dict': {'__contains__', '__delitem__',
'__dir__', '__eq__', '__format__',
'__ge__', '__getattribute__',
'__getitem__', '__gt__', '__init__',
'__init_subclass__', '__iter__',
'__le__', '__len__', '__lt__', '__ne__',
'__new__', '__reduce__',
'__reduce_ex__', '__repr__',
'__setitem__', '__sizeof__',
'__subclasshook__', 'clear', 'copy',
'fromkeys', 'get', 'items', 'keys',
'pop', 'popitem', 'setdefault',
'update', 'values'},
'object': {'__delattr__', '__setattr__',
'__str__'}})})
but why did methods like pop
, update
get classified under CustomDict
, whereas, __len__
, __lt__
, __ne__
, got classified under dict
.
shouldn’t only flip
have been classified under CustomDict
or
everything that is classified under dict
for the second case + flip
should have been classified under CustomDict
.
why did it classify some methods under CustomDict
and others under dict
?