Как узнать тип переменной Python
В Python есть две функции type() и isinstance() с помощью которых можно проверить к какому типу данных относится переменная.
Разница между type() и isinstance()
type() возвращает тип объекта
isinstance() возвращает boolean значение — принадлежит объект данному типу или нет
type()
Встроенная функция type() это самый простой способ выяснить тип объекта. В Python всё является объектом, объекты делятся на изменяемые и неизменяемые .
Вы можете воспользоваться type() следующим образом.
Пример использования type()
В Python четырнадцать типов данных.
Для начала рассмотрим три численных типа (Numeric Types):
- int (signed integers)
- float (вещественные числа с плавающей точкой)
- complex (комплексные числа)
Создайте три переменные разного численного типа и проверьте работу функции:
var_int = 1380 var_float = 3.14 var_complex = 2.0-3.0j print (type(var_int)) print (type(var_float)) print (type(var_complex))
Рассмотрим ещё несколько примеров
# Text Type: var_str = ‘heihei.ru’ # Boolean Type: var_bool = True # Sequence Types: var_list = [ ‘heihei.ru’ , ‘topbicycle.ru’ , ‘urn.su’ ] var_tuple = ( ‘andreyolegovich.ru’ , ‘aredel.com’ ) var_range = range(0,9) print (type(var_str)) print (type(var_bool)) print (type(var_list)) print (type(var_tuple)) print (type(var_range))
Спецификацию функции type() вы можете прочитать на сайте docs.python.org
Команда type
Есть ещё полезная команда type которая решает другую задачу.
С помощью команды type можно, например, определить куда установлен Python.
Подробнее об этом можете прочитать здесь
python3 is hashed (/usr/bin/python3)
python3 is hashed (/usr/bin/python)
isinstance()
Кроме type() в Python есть функция isinstance(), с помощью которой можно проверить не относится ли переменная к какому-то определённому типу.
Иногда это очень удобно, а если нужно — всегда можно на основе isinstance() написать свою функцию.
Пример использования
Создадим пять переменных разного типа и проверим работу функции
var_int = 1380 var_str = ‘heihei.ru’ var_bool = True var_list = [ ‘heihei.ru’ , ‘topbicycle.ru’ , ‘urn.su’ ] var_tuple = ( ‘andreyolegovich.ru’ , ‘aredel.com’ ) if ( isinstance (var_int , int )): print ( f» < var_int >is int» ) else : print ( f» < var_int >is not int» ) if ( isinstance (var_str , str )): print ( f» < var_str >is str» ) else : print ( f» < var_str >is not str» ) if ( isinstance (var_bool , bool )): print ( f» < var_bool >is bool» ) else : print ( f» < var_bool >is not bool» ) if ( isinstance (var_list , list )): print ( f» < var_list >is list» ) else : print ( f» < var_list >is not list» ) if ( isinstance (var_tuple , tuple)): print ( f» < var_tuple >is tuple» ) else : print ( f» < var_tuple >is not tuple» )
1380 is int heihei.ru is str True is bool [‘heihei.ru’, ‘topbicycle.ru’, ‘urn.su’] is list (‘andreyolegovich.ru’, ‘aredel.com’) is tuple
Из isinstance() можно сделать аналог type()
Напишем свою фукнцию по определению типа typeof() на базе isinstance
def typeof(your_var): if ( isinstance (your_var, int)): return ‘int’ elif ( isinstance (your_var, bool)): return ‘bool’ elif ( isinstance (your_var, str)): return ‘str’ elif ( isinstance (your_var, list)): return ‘list’ elif ( isinstance (your_var, tuple)): return ‘tuple’ else : print(«type is unknown»)
Протестируем нашу функцию
Принадлежность к одному из нескольких типов
Если нужно проверить принадлежит ли объект не к какому-то одному, а к группе типов, эти типы можно перечислить в скобках.
Часто бывает нужно проверить является ли объект числом, то есть подойдёт как int, так и float
print ( isinstance ( 2.0 , ( int , float )))
Проверим несколько значений из списка
l3 = [ 1.5 , — 2 , «www.heihei.ru» ] for item in l3: print ( isinstance (item, ( int , float )))
Проверка списка или другого iterable
Часто бывает нужно проверить не одну переменную а целый список, множество, кортеж или какой-то другой объект.
Эту задачу можно решить с помощью isinstance() и функций:
Проверить все ли элементы списка l1 int
l1 = [ 1 , 2 , 3 ] if all ( map ( lambda p: isinstance (p, int ), l1)): print ( «all int in l1» )
Проверить несколько списков на int и float
l1 = [ 3 , — 4.0 , 5.5 , — 6.2 ] l2 = [ 1 , — 2 , «test» ] def verif_list (l): return ( all ( map ( lambda p: isinstance (p, ( int , float )), l))) if __name__ == «__main__» : print (verif_list(l1)) print (verif_list(l2))
Помимо isinstance() в Python есть функция issubclass() с помощью которой проверяется является один класс производным от другого.
В других языках
- Си: такой функции нет.
- C++: похожую задачу решает функция typeid()