Вопрос-Ответ

Determine the type of an object? [duplicate]

Определить тип объекта?

Есть ли простой способ определить, является ли переменная списком, словарем или чем-то еще?

Переведено автоматически
Ответ 1

Существуют две встроенные функции, которые помогают вам определить тип объекта. Вы можете использовать, type() если вам нужен точный тип объекта, и isinstance() для проверки типа объекта на соответствие чему-либо. Обычно вы хотите использовать isinstance() большую часть времени, поскольку он очень надежный, а также поддерживает наследование типов.


Чтобы получить фактический тип объекта, вы используете встроенную type() функцию. Передача объекта в качестве единственного параметра вернет тип object этого объекта:

>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True

Это, конечно, работает и для пользовательских типов:

>>> class Test1 (object):
pass
>>> class Test2 (Test1):
pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True

Обратите внимание, что type() вернет только непосредственный тип объекта, но не сможет рассказать вам о наследовании типов.

>>> type(b) is Test1
False

Чтобы решить эту проблему, вам следует использовать функцию isinstance . Это, конечно, работает и для встроенных типов:

>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True

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 однако сработает).

Ответ 4

Для экземпляров object у вас также есть:

__class__

атрибут. Вот пример, взятый из консоли Python 3.3

>>> str = "str"
>>> str.__class__
<class 'str'>
>>> i = 2
>>> i.__class__
<class 'int'>
>>> class Test():
... pass
...
>>> a = Test()
>>> a.__class__
<class '__main__.Test'>

Помните, что в python 3.x и в классах нового стиля (опционально доступных в Python 2.6) класс и тип были объединены, и иногда это может привести к неожиданным результатам. В основном по этой причине мой любимый способ тестирования типов / классов - использовать встроенную функцию isinstance.

python dictionary