Если проблема заключается в дополнительном времени компиляции и раздувании бинарного размера, полученном путем компиляции .h как части всех используемых им .cpp-модулей, во многих случаях то, что вы можете сделать, - это сделать класс шаблона опустившимся из не-шаблонного базовый класс для не зависящих от типа частей интерфейса, и что базовый класс может иметь свою реализацию в файле .cpp.
Вызов функции Collections.NamedTuple
дает вам новый тип, который является подклассом кортеж
(и никаких других классов) с членом Название _Fields
Это кортеж, чьи предметы являются все строки. Таким образом, вы могли бы проверить для каждого из них:
def isnamedtupleinstance(x):
t = type(x)
b = t.__bases__
if len(b) != 1 or b[0] != tuple: return False
f = getattr(t, '_fields', None)
if not isinstance(f, tuple): return False
return all(type(n)==str for n in f)
можно получить ложный положительный от этого, но только если кто-то уходит с их способа сделать тип, который выглядит лота Как называемый кортеж, но не один ;-).
Если вам нужно проверить, прежде чем вызовать на нее специфические функции NamedTuple, просто позвоните им и вместо этого поймайте исключение. Это предпочтительный способ сделать это в Python.