On Wed, Jul 01, 2020 at 02:12:35PM +0100, Stestagg wrote:

> > And you needed to be told several times before you learned that dicts,
> > and dict views, are not sequences?
> 
> I've spent vastly more of my professional career developing in python
> environments where such code worked (python versions < 3).

You have never used a version of Python where you could index dicts or 
dict views, it has never worked. We've been able to index *lists*, of 
course, and the natural translation from Python 2:

    mydict.keys()[0]  # Indexing a *list* not a view

is to write this:

    list(mydict.keys())[0]

If you want to emulate code from Python 2, that is what you should be 
writing. Problem solved!

I've seen many changes in Python over the years, and sometimes it's 
taken me a while to adapt. But when I keep getting the same error, I 
take it as *my failure*, not a sign that the language is wrong and needs 
to be reverted -- especially when there is a simple, and well-known, 
work-around to give me the older semantics with a minimum of trouble.

So when I hear someone describing themselves as a *senior* Python dev, 
but apparently being unable to adapt to the change of spelling 
`.viewitems` --> `.items`, it takes me by surprise.


> The fact that
> one of the many types of ordered sequence containers in python doesn't
> support numeric indexing seems like a reasonable thing to forget,

Neither dicts nor dict views are sequences, so that is not a fact.

    py> from collections.abc import Sequence
    py> isinstance({}, Sequence)
    False
    py> isinstance({}.items(), Sequence)
    False

They're not even conceptually sequences; they are conceptually mappings 
and sets.

In Python 2.7, the same applied, correcting for the change of spelling:

    py> from collections import Sequence
    py> isinstance({}.viewitems(), Sequence)
    False

Of course in 2.x `dict.items` returned a sequence (a list), which means 
that it supported the full complement of list methods, such as sort, 
reverse, slicing, insertion, appending etc. Being a list, it could 
contain duplicates:

    py> obj = {}.keys()
    py> obj.extend([1, 1])
    py> assert obj == [1, 1]

Should we push for dict views to support all the methods that lists 
supported in Python 2, so that people don't have to learn the new 
spelling? I don't think so.


> especially when such containers are a relatively new addition to the
> language, and are encountered infrequently.  Your wording here sounds like
> this is something I should feel shame about?

Dict views have been in the language for a decade (to be precise: eleven 
and a half years), so over one third of the existance of the language.

Anyone with less than a decades' experience in Python has never known a 
time that Python didn't have dict views.

Python 3 `dict.items` is not the same thing as Python 2's `dict.items`, 
it is Python 2.7's `dict.viewitems`. If you want a list, call `list`. 
That is effectively what Python 2 was implicitly doing. Python 3 just 
makes it explicit.


> Hopefully if this proposed change is made, then dict views, which are,
> after all, iterable ordered containers, can be considered Sequences again.

Dict views have never been considered sequences. This is not a reversion 
to older semantics, this is an unprecedented new behaviour.


-- 
Steven
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/OZYHW4OJWAXR6C4NU5IMZQI3BBCMU5KQ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to