On Tue, 30 Jul 2019 at 09:33, Christian Tismer <[email protected]> wrote:
> >>> typing.NamedTuple("__f", x=int, y=int)
> <class '__main__.__f'>
> >>> typing.NamedTuple("__f", x=int, y=int) is typing.NamedTuple("__f",
> x=int, y=int)
> False
This appears to go right back to collections.namedtuple:
>>> from collections import namedtuple
>>> n1 = namedtuple('f', ['a', 'b', 'c'])
>>> n2 = namedtuple('f', ['a', 'b', 'c'])
>>> n1 is n2
False
I found that surprising, as I expected the named tuple type to be
cached based on the declared name 'f'. But it's been that way forever
so obviously my intuition here is wrong. But maybe it would be useful
for this case if there *was* a way to base named tuple identity off
the name/fields? It could be as simple as caching the results:
>>> from functools import lru_cache
>>> cached_namedtuple = lru_cache(None)(namedtuple)
>>> n1 = cached_namedtuple('f', ('a', 'b', 'c')) # A tuple rather than a list
>>> of field names, as lists aren't hashable
>>> n2 = cached_namedtuple('f', ('a', 'b', 'c'))
>>> n1 is n2
True
Paul
_______________________________________________
Python-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/OBWZHQGIJA2H2HP2VGTKHVLNY2IFJRXW/