Как определить тип переменной в Python?
Так что если у вас есть переменная, например:
one = 1
Вы хотите знать его тип?
В Python есть правильные и неправильные способы делать практически все. Вот правильный путь:
Использование type
>>> type(one)
<type 'int'>
Вы можете использовать атрибут __name__
, чтобы получить имя объекта. (Это один из немногих специальных атрибутов, для которого вам нужно использовать имя __dunder__
, для него нет даже метода в модуле inspect
.)
>>> type(one).__name__
'int'
Не использовать __class__
В Python имена, начинающиеся с подчеркиваний, семантически не являются частью общедоступного API, и пользователям рекомендуется избегать их использования. (За исключением случаев, когда это абсолютно необходимо).
Поскольку type
дает нам класс объекта, мы должны избегать его получения напрямую. :
>>> one.__class__
Обычно это первая идея, которую люди имеют при доступе к типу объекта в методе - они уже ищут атрибуты, поэтому тип кажется странным. Например:
class Foo(object):
def foo(self):
self.__class__
Не. Вместо этого введите (self):
class Foo(object):
def foo(self):
type(self)
Подробности реализации целых и чисел
Как узнать тип переменной: 32-разрядная без знака, 16-разрядная со знаком и т. Д .?
В Python эти особенности являются деталями реализации. Итак, в общем, мы обычно не беспокоимся об этом в Python. Однако, чтобы удовлетворить ваше любопытство ...
В Python 2 int обычно представляет собой целое число со знаком, равное ширине слова в реализации (ограничено системой). Обычно это реализовано как long в C . Когда целые числа становятся больше этого значения, мы обычно конвертируем их в длинные Python (с неограниченной точностью, не путать с длинными C).
Например, в 32-битном Python 2 мы можем сделать вывод, что int является 32-битным целым числом со знаком:
>>> import sys
>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'
В Python 3 старый int исчезает, и мы просто используем (Python) long как int, который имеет неограниченную точность.
Мы также можем получить некоторую информацию о числах с плавающей точкой Python, которые обычно реализуются как double в C:
>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15,
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)
Заключение
Не используйте __class__
, семантически непубличный API, чтобы получить тип переменной. Вместо этого используйте type
.
И не беспокойтесь о деталях реализации Python. Я сам не сталкивался с проблемами вокруг этого. Вы, вероятно, тоже не будете, и если вы действительно это сделаете, вы должны знать достаточно, чтобы не искать этот ответ для того, что делать.