Есть ли простой способ определить, является ли переменная списком, словарем или чем-то еще?
Переведено автоматически
Ответ 1
Существуют две встроенные функции, которые помогают вам определить тип объекта. Вы можете использовать, type() если вам нужен точный тип объекта, и isinstance() для проверки типа объекта на соответствие чему-либо. Обычно вы хотите использовать isinstance() большую часть времени, поскольку он очень надежный, а также поддерживает наследование типов.
Чтобы получить фактический тип объекта, вы используете встроенную type() функцию. Передача объекта в качестве единственного параметра вернет тип object этого объекта:
isinstance() обычно предпочтительный способ определения типа объекта, потому что он также будет принимать производные типы. Поэтому, если вам действительно не нужен тип object (по какой-либо причине), использование isinstance() предпочтительнее, чем type().
Второй параметр isinstance() также принимает набор типов, поэтому можно проверять наличие нескольких типов одновременно. isinstance затем вернет true, если объект относится к любому из этих типов:
>>> isinstance([], (tuple, list, set)) True
Ответ 2
Использовать type():
>>> a = [] >>> type(a) <type'list'> >>> f = () >>> type(f) <type'tuple'>
Ответ 3
Возможно, было бы более питонически использовать try...except блок. Таким образом, если у вас есть класс, который крякает как список или крякает как dict , он будет вести себя должным образом, независимо от того, каков его действительно тип.
Чтобы уточнить, предпочтительным методом "определения разницы" между типами переменных является так называемый утиный ввод: пока методы (и возвращаемые типы), на которые реагирует переменная, соответствуют ожиданиям вашей подпрограммы, относитесь к ней так, как вы ожидаете. Например, если у вас есть класс, который перегружает операторы скобок с помощью getattr и setattr, но использует какую-то забавную внутреннюю схему, было бы уместно, чтобы он вел себя как словарь, если это то, что он пытается эмулировать.
Другая проблема с type(A) is type(B) проверкой заключается в том, что если A является подклассом B, он вычисляется до false когда программно вы надеетесь, что это будет true. Если объект является подклассом списка, он должен работать как список: проверка типа, представленная в другом ответе, предотвратит это. (isinstance однако сработает).
Помните, что в python 3.x и в классах нового стиля (опционально доступных в Python 2.6) класс и тип были объединены, и иногда это может привести к неожиданным результатам. В основном по этой причине мой любимый способ тестирования типов / классов - использовать встроенную функцию isinstance.