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 <[email protected]> wrote:
>
> On Nov 30, 2019, at 20:21, Wes Turner <[email protected]> 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 -- [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/OA7NQRF4VTFG2DJVNJAAJ7YIQNB3IVVR/
Code of Conduct: http://python.org/psf/codeofconduct/