On Tue, 30 Jul 2019 at 09:33, Christian Tismer <tismer@stackless.com> 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