[Python-ideas] get() method for list and tuples

Steven D'Aprano steve at pearwood.info
Tue Feb 28 21:10:34 EST 2017


On Wed, Mar 01, 2017 at 02:26:18AM +0100, Michel Desmoulin wrote:

> The fact the API is not exactly the same doesn't prevent duck typing.
> Duck typing is precesily about incomplete but good enough similar API.

Indeed. But the relationship goes this way:

    # Duck-typing done the right way.

    Types P and Q both quack like ducks, so if all we need is 
    something that quacks, either P or Q will do.


not this way:

    Types P and Q both quack like ducks. I want something that
    swims like a duck, like P. Q doesn't swim at all, so we need
    to add Q.swim() so we can duck-type P or Q.

If we are going to propose Q.swim(), it must be because it makes sense 
for Q instances to swim, regardless of what P does. 


> For the dict and list:
> 
> - you can iterate on both
> - you can index both
> - you can size both

Right -- because all these operations make sense for both dicts and 
lists.

Does get() make sense for both? It certainly makes sense for dicts. It 
makes *some* sense for lists, but (in my opinion) not enough to justify 
making it a built-in method of the type.

Making it a built-in method isn't just a convenience, it is also 
blessing this as "the right thing to do". As I've said, in my experience 
trying to index into arbitrary positions of a sequence (list or tuple) 
without knowing whether that index exists or not is rarely the right 
thing to do. (That makes it very different from key lookup in a mapping 
or dict.)

I believe that the way to argue for list.get() is not because it will 
make it easy to duck-type lists and dicts. It is (in my experience) very 
rare to need to duck-type lists and dicts. I believe you should identify 
code that handles lists that would benefit from this change.

Under what circumstances do you ask for the 17th item of a list which 
may only contain 9 items? (For arbitrary values of 17 and 9.)



-- 
Steve


More information about the Python-ideas mailing list