My mistake, I skimmed and assumed that the question was asking for this: from collections import namedtuple data = {'1': 1, 'two-2': 2} x = namedtuple('x', data.keys()) # ValueError: Type names and field names must be valid identifiers: '1'
# But now understand that the request was for this: from collections import namedtuple Item = namedtuple('Item', ['key', 'value']) def items_tuple(self): for key, value in self.items(): yield Item(key, value) # So that this test would pass: def test_items(): data = {'1': 1, 'two-2': 2} for item in data.items(): assert hasattr('key', item) assert hasattr('value', item) key, value = item assert item.key == key assert item.value == value # FWIW, here are rough timings: data = dict.fromkeys(range(10000)) def timeit(code): print(f">>> {code}") get_ipython().run_line_magic('timeit', code) timeit('for item in data.items(): item[0], item[1]') timeit('for key, value in data.items(): key, value') timeit('for item in items_tuple(data): item.key, item.value') >>> for item in data.items(): item[0], item[1] 874 µs ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) >>> for key, value in data.items(): key, value 524 µs ± 4.26 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) >>> for item in items_tuple(data): item.key, item.value 5.82 ms ± 117 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) On Sun, Dec 1, 2019 at 1:24 AM Andrew Barnert <abarn...@yahoo.com> wrote: > > On Nov 30, 2019, at 20:21, Wes Turner <wes.tur...@gmail.com> wrote: > > > > What about keys that contain invalid characters for attribute names? > > What about them? > > > items = {'1': 1, 'two-3': 4,} > > x = object() > > x.__dict__.update(items) # dangerous > > x = AttrDict(**items) > > x.1 # error > > x.two-3 # error > > The message you quoted was about how in Python 2 (but not 3) you could > destructure parameters: > > sorted({1:300, 2:4}.items(), key=lambda (key, value): value) > > The wider discussion is about how if items() were a view of namedtuples > instead of just sequences you could do something even better: > > sorted({1:300, 2:4}.items(), key=lambda it: it.value) > > What does either of those have to do with using a dict whose keys are not > identifiers as an attribute dictionary for an object? Neither restoring > Python 2’s parameter destructuring nor making items namedtuples would in any > way affect any of the code you wrote. > > _______________________________________________ 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/OA7NQRF4VTFG2DJVNJAAJ7YIQNB3IVVR/ Code of Conduct: http://python.org/psf/codeofconduct/