I confess that after reading this thread, and a number of related past ones, I'm still not certain exactly what problem all of this is needed to solve. ISTM that if one has a special function calling requirement to pass in an ordered collection of key/value pairs, one can already just use a special and available call signature for your function: def myfunc(a, b, *keyvals): od = OrderedDict(keyvals) # ... do other stuff Call this like: value = myfunc(foo, bar, ('a',1), ('z',2), ('b',3)) Yes, it's a slightly special form of the calling convention, but it does something slightly special with its key/val-like arguments, so that seems like a reasonable tradeoff. The solution is purely local to the writer of the function who needs this. Even if you have an existing OrderedDict that you want to pass in, you can use that like: value = myfunc(foo, bar, *myOD.items()) Of course, if you want to be picky, you could stick in a check at the top of your function definition: assert all(isinstance(x, tuple) and len(x)==2 for x in keyvals) -- Keeping medicines from the bloodstreams of the sick; food from the bellies of the hungry; books from the hands of the uneducated; technology from the underdeveloped; and putting advocates of freedom in prisons. Intellectual property is to the 21st century what the slave trade was to the 16th.