On Nov 30, 2019, at 16:36, Oscar Benjamin <oscar.j.benja...@gmail.com> wrote:
> 
> On Sat, 30 Nov 2019 at 22:24, Steven D'Aprano <st...@pearwood.info> wrote:
>> 
>>> On Sat, Nov 30, 2019 at 06:16:49PM -0300, Soni L. wrote:
>>> 
>>> It'd be quite nice if dict.items() returned a namedtuple so all these
>>> x[0], x[1], el[0], el[1], etc would instead be x.key, x.value, el.key,
>>> el.value, etc. It would be more readable and more maintainable.
>> 
>> If you are doing
>> 
>>    for item in somedict.items():
>>         process(item[0])
>>         process(item[1])
>> 
>> you could do this instead:
>> 
>>    for key, value in somedict.items():
>>         process(key)
>>         process(value)
> 
> You can also make your own function to get the items as namedtuples.
> That can work now with any class that defines items the current way.
> 
> from collections import namedtuple
> 
> Item = namedtuple('Item', ['key', 'value'])
> 
> def nameditems(d):
>    return (Item(*t) for t in d.items())
> 
> d = {'a': 1, 'b': 2}
> 
> for item in nameditems(d):
>    print(item.key, item.value)
> 
> Comparing that with Steve's example above though I don't see the
> advantage of namedtuples here.

Presumably the main advantage is for cases where you can’t destructure the 
tuple in-place:

    sorted(d.items(), key=lambda it: it.value)

There’s no nice way to write that today. Maybe this makes it clear?

    sorted(d.items(), key=(ValueGetter := operator.itemgetter(1)))

But normally you don’t bother; you just live with using [1] and assuming your 
reader will know that [1] on a mapping item is the value. Which isn’t terrible, 
because it almost always is obvious you’ve got a mapping item, and almost every 
reader does know what [1] means there. But it’s not as nice as using .value 
would be.

As a secondary advantage, if you’ve been using some other language and 
accidentally write `for value, key in d.items()` it will appear correct but 
then do the wrong thing inside the loop. (And if I’m trying to fix your code, I 
might not even notice that you got it backward until after a couple hours 
banging my head on the debugger.) With a namedtuple, there’s no way to mix up 
the names. I don’t think this comes up nearly as often with dict items as with, 
say, stat struct values, so it’s not a huge issue, but it’s not completely 
negligible.
_______________________________________________
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/VAJSM7QIUMNJFHK5B6E5R42LF46KUWMJ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to