Проверьте, является ли класс python str, списком и т. Д

#python #boolean #conditional-statements #python-class

Вопрос:

У меня есть список занятий:

 [<class 'str'>, <class 'str'>, <class 'str'>, <class 'str'>, <class 'datetime.date'>, <class 'decimal.Decimal'>, <class 'decimal.Decimal'>, <class 'str'>, <class 'datetime.date'>, <class 'decimal.Decimal'>, <class 'decimal.Decimal'>, <class 'decimal.Decimal'>]
 

Я хочу выполнить логический тест, аналогичный isinstance():

 [isinstance(x, str) for x in l]
 

но isinstance() принимает только объекты, а не классы.

Результаты, которые я хочу, чтобы приведенный выше список проверял, является ли класс строкой, были бы примерно такими:

 [True, True, True, True, False, False, False, True, False, False, False, False]
 

Комментарии:

1. Используйте issubclass вместо isinstance .

2.Классы — это объекты. Проблема в том, что класс str не является экземпляром str ; это экземпляр type . Это подкласс сам по себе, но (если вы не беспокоитесь о подклассах) вы можете провести прямое сравнение классов с is : [x is str for x in l] .

3. Спасибо @chepner! issubclass сработал.

Ответ №1:

Используйте == оператора:

 [x == str for x in l]
 

Ответ №2:

Поскольку у вас есть список классов, вы захотите использовать issubclass , а не isinstance :

 [issubclass(x, str) for x in l]
 

Из документов Python:

issubclass(class, classinfo)

Возвращает True , если класс является подклассом (прямым, косвенным или виртуальным) classinfo . Класс считается подклассом самого себя. classinfo может быть кортеж объектов класса или тип объединения, в этом случае возвращается True , если класс является подклассом любой записи classinfo . В любом другом случае возникает TypeError исключение.