On Nov 30, 2019, at 16:36, Oscar Benjamin <[email protected]> wrote:
>
> On Sat, 30 Nov 2019 at 22:24, Steven D'Aprano <[email protected]> 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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/VAJSM7QIUMNJFHK5B6E5R42LF46KUWMJ/
Code of Conduct: http://python.org/psf/codeofconduct/