What about keys that contain invalid characters for attribute names? items = {'1': 1, 'two-3': 4,} x = object() x.__dict__.update(items) # dangerous x = AttrDict(**items) x.1 # error x.two-3 # error
On Saturday, November 30, 2019, Eric V. Smith <e...@trueblade.com> wrote: > On 11/30/2019 8:51 PM, Andrew Barnert via Python-ideas wrote: >> >> 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. > > How I miss python 2's parameter unpacking: > >>>> sorted({1:300, 2:4}.items(), key=lambda (key, value): value) > [(2, 4), (1, 300)] > > Eric > _______________________________________________ > 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/HRCAVIV4KYIPMQ5C7SGX2C5OW6IPU5JG/ > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ 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/JDIUMS6TAB6XWNOPAHK6SKEPGLHIEL5B/ Code of Conduct: http://python.org/psf/codeofconduct/