Generic dictionary
Thorsten Kampe
thorsten at thorstenkampe.de
Sun Nov 20 07:12:51 EST 2016
* Peter Otten (Sun, 20 Nov 2016 10:43:01 +0100)
>
> Thorsten Kampe wrote:
> >
> > I'd like to extend the dictionary class by creating a class that acts
> > like a dictionary if the class is instantiated with a dictionary and
> > acts like a "dictitem" ([(key1, value1), (key2, value2), ...]) if
> > instantiated with a list (that is dictitem).
> >
> > The code (see extract at bottom) works well but it contains a lot of
> > "if this is a dictionary then do as a dictionary already does"
> > boilerplate code". How can I "inherit"(?)/"subclass"(?)/derive from
> > dict so I don't have to write the code for the dictionary case?
>
> Hm.
>
> def GenericDict(dict_or_items):
> if isinstance(dict_or_items, dict):
> return dict(dict_or_items)
> else:
> return SimpleGenericDictWithOnlyTheFalseBranchesImplemented(
> dict_or_items
> )
That would be a kind of factory function for the class?
> > ```
> > class GenericDict:
> > """
> > a GenericDict is a dictionary or a list of tuples (when the keys
> > are not hashable)
> > """
> > def __init__(inst, generic_dict):
> > inst._generic = generic_dict
> >
> > def __getitem__(inst, key):
> > if isinstance(inst._generic, dict):
> > return inst._generic[key]
> > else:
> > return inst.values()[inst.keys().index(key)]
>
> It's not obvious why you'd ever want that. What's the use case?
The use case is an Equivalence class which creates a {invariant(x):
[x, y, z] ...} dictionary. Since the Equivalence class should accept
all kinds of key functions, I have to make sure that lists (which are
not hashable), etc. can be handled as keys.
Treating a list of tuples as a substitute for a dictionary is a well
established idiom (think list(dict.items()) and dict()).
The GenericDict class allows the Equivalence class to be agnostic
regarding the underlying data structure. It tries to create a
dictionary and if that fails uses a dictitem. All method calls are
the same because that's handled by GenericDict.
Thorsten
More information about the Python-list
mailing list