On Nov 30, 2019, at 16:36, Oscar Benjamin <oscar.j.benjamin@gmail.com> wrote:
On Sat, 30 Nov 2019 at 22:24, Steven D'Aprano <steve@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.