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/