Как проверить, является ли объект экземпляром именованного кортежа?

Если проблема заключается в дополнительном времени компиляции и раздувании бинарного размера, полученном путем компиляции .h как части всех используемых им .cpp-модулей, во многих случаях то, что вы можете сделать, - это сделать класс шаблона опустившимся из не-шаблонного базовый класс для не зависящих от типа частей интерфейса, и что базовый класс может иметь свою реализацию в файле .cpp.

34
задан Georgy 17 January 2019 в 09:15
поделиться

2 ответа

Вызов функции 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)

можно получить ложный положительный от этого, но только если кто-то уходит с их способа сделать тип, который выглядит лота Как называемый кортеж, но не один ;-).

39
ответ дан 27 November 2019 в 05:49
поделиться
[11378791-

Если вам нужно проверить, прежде чем вызовать на нее специфические функции NamedTuple, просто позвоните им и вместо этого поймайте исключение. Это предпочтительный способ сделать это в Python.

4
ответ дан 27 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: