[Python-ideas] adding dictionaries

Steven D'Aprano steve at pearwood.info
Wed Jul 30 02:17:26 CEST 2014


On Tue, Jul 29, 2014 at 06:12:16PM -0500, Ron Adam wrote on the 
similarity of lists and dicts:

[...]
> Well, here is how they currently compare.
> 
> >>> set(dir(dict)).intersection(set(dir(list)))
> {'copy', '__hash__', '__format__', '__sizeof__', '__ge__', '__delitem__', 
> '__getitem__', '__dir__', 'pop', '__gt__', '__repr__', '__init__', 
> '__subclasshook__', '__eq__', 'clear', '__len__', '__str__', '__le__', 
> '__new__', '__reduce_ex__', '__doc__', '__getattribute__', '__ne__', 
> '__reduce__', '__contains__', '__delattr__', '__class__', '__lt__', 
> '__setattr__', '__setitem__', '__iter__'}

Now strip out the methods which are common to pretty much all objects, 
in other words just look at the ones which are common to mapping and 
sequence APIs but not to objects in general:

{'copy', '__ge__', '__delitem__', '__getitem__', 'pop', '__gt__',  
'clear', '__len__', '__le__', '__contains__', '__lt__', '__setitem__', 
'__iter__'}

And now look a little more closely:

- although dicts and lists both support order comparisons like > and <,
  you cannot compare a dict to a list in Python 3;

- although dicts and lists both support a pop method, their signatures
  are different; x.pop() will fail if x is a dict, and x.pop(k, d) will
  fail if x is a list;

- although both support membership testing "a in x", what is being 
  tested is rather different; if x is a dict, then a must be a key,
  but the analog of keys for lists is the index, not the value.


So the similarities between list and dict are:

* both have a length

* both are iterable

* both support subscripting operations x[i]

* although dicts don't support slicing x[i:j:k]

* both support a copy() method

* both support a clear() method

That's not a really big set of operations in common, and they're rather 
general.

The real test is, under what practical circumstances would you expect to 
freely substitute a list for a dict or visa versa, and what could you do 
with that object when you received it?

For me, the only answer that comes readily to mind is that the dict 
constructor accepts either another dict or a list of (key,item) pairs. 

[...]
> They do have quite a lot in common already.  The usefulness of different 
> types having the same methods is that external code can be less specific to 
> the objects they handle.

I don't think that it is reasonable to treat dicts and lists as having a 
lot in common. They have a little in common, by virtue of both being 
containers, but then a string bag and a 40ft steel shipping container 
are both containers too, so that doesn't imply much similarity :-) It 
seems to me that outside of utterly generic operations like iteration, 
conversion to string and so on, lists do not quack like dicts, and dicts 
do not swim like lists, in any significant sense.


-- 
Steven


More information about the Python-ideas mailing list