OrderedDict with kwds

Albert-Jan Roskam sjeik_appie at hotmail.com
Fri Apr 21 14:08:10 EDT 2017


For regular dicts I like to use the dict() function because the code is easier to write and read. But OrderedDict() is not equivalent to dict():
In the docstring of collections.OrderedDict it says "keyword arguments are not recommended because their insertion order is arbitrary" (https://github.com/python/cpython/blob/3.6/Lib/collections/__init__.py)

It took me while to realize that. What is the best way to use keywords to create an ordered dict, while maintaining insertion order?

Below is OrderedDict.__init__. Would the insertion order be preserved if the last line were to be replaced with:

if kwds:
    for k, v in kwds.items():
        self[k] = v
if args:
    self.__update(*args)  # no **kwds!


###
class OrderedDict(dict):
    'Dictionary that remembers insertion order'

    def __init__(*args, **kwds):
        '''Initialize an ordered dictionary.  The signature is the same as
        regular dictionaries, but keyword arguments are not recommended because
        their insertion order is arbitrary.
        '''
        if not args:
            raise TypeError("descriptor '__init__' of 'OrderedDict' object "
                            "needs an argument")
        self, *args = args
        if len(args) > 1:
            raise TypeError('expected at most 1 arguments, got %d' % len(args))
        try:
            self.__root
        except AttributeError:
            self.__hardroot = _Link()
            self.__root = root = _proxy(self.__hardroot)
            root.prev = root.next = root
            self.__map = {}
        self.__update(*args, **kwds)

Thanks!

Albert-Jan



More information about the Python-list mailing list