Как узнать тип переменной python
Перейти к содержимому

Как узнать тип переменной python

  • автор:

Проверка типов данных и «утиная» типизация в Python

В этой статье мы вам расскажем о проверке типов, о различных типах данных в разных языках, а также о неявной типизации и подсказках.

В Python проверка типов выполняется в интерпретаторе. Так как Python — язык с динамической типизацией, он не заставляет пользователя принудительно указывать тип объектов. Это потенциально может привести к ошибкам, причем их будет трудно найти. Чтобы избежать этого, Python можно использовать вместе с другими инструментами и реализовывать проверки типов вместе с собственным алгоритмом неявной типизации.

Существует два метода типизации, за каждым из которых стоят определенные языки программирования:

  • со статической типизацией
  • с динамической типизацией.

Языки со статической типизацией

Проверка типа переменной выполняется во время компиляции. Кроме того, система типов языка заставляет явно объявлять «тип данных» переменной перед ее использованием.

Вот ряд языков программирования со статической типизацией: Scala, Java, C++ и так далее. Например, объявление переменной строкового типа в языке Scala выглядит следующим образом:

var myCar:String = "Mercedes";

В этом примере мы видим, что переменная myCar объявлена явным образом как тип данных String со значением Mercedes .

Языки с динамической типизацией

В этих языках проверка типа переменной выполняется во время выполнения. Кроме того, система типизации языка не требует явного объявления типа данных переменной перед ее использованием. К языкам программирования с динамической типизацией относятся Python, JavaScript, Ruby и так далее.

Например, переменная строкового типа в языке Python определяется следующим образом:

myCar = "Mercedes"

Здесь мы видим, что переменную myCar не нужно явно объявлять.

Функции type() и ‘isinstance() в Python

Тип переменной в Python можно определить при помощи встроенной функции type() . Функция type() может использоваться во время выполнения программы в целях отладки, чтобы точно идентифицировать типы используемых переменных. Давайте проверим тип переменной:

my_var = 12 print(type(my_var))

Приведенный выше код выдает в качестве результата ‘int’. Тип данных переменной my_var является целочисленным, и функция type() определяет его именно таким образом.

При помощи функции isinstance(‘ obj ‘,’ class ‘) в языке Python можно определить, является ли данный объект ( ‘obj’ ) экземпляром класса ( ‘class’ ). Возвращается булево значение ( True или False ).

my_var = "Hello" print(isinstance(my_var,str))

Приведенный выше код выдает в качестве результата True . Поскольку тип данных переменной my_var строковый, то данная переменная является экземпляром класса str и функция isinstance() это удостоверяет.

Неявная («утиная») типизация в Python

В Python действует популярный принцип: «Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка». Попросту говоря, тип объекта или класса не имеет значения, но объект должен содержать аналогичные методы и свойства, тогда объект может использоваться для определенной цели.
Давайте разберем это на конкретном примере.

У нас есть два класса: Duck и Human . Класс Duck содержит методы quack и fly . Аналогично класс Human — это класс со своим собственным набором методов quack и fly . Duck и Human это разные классы и, соответственно, объекты этих классов также отличаются друг от друга. Однако класс Human содержит те же методы, quack и fly , что есть и в классе Duck . Ещё у нас есть метод fly_quack() . Он больше подошел бы утке (класс Duck ), чем человеку (класс Human ), так как с помощью данного метода можно одновременно крякать и летать.

class Duck: def quack(self): print('Quack') def fly(self): print('Flap') class Human: def quack(self): print('Trying to Quack like a duck') def fly(self): print('Spreading my arm to flap like a duck') def fly_quack(thing): thing.quack() thing.fly()

Давайте теперь создадим в переменной du экземпляр класса Duck и передадим его в функцию fly_quack(du) . Точно также в переменной h создадим экземпляр класса Human и передадим его в ту же функцию.

du = Duck() fly_quack(du) h = Human() fly_quack(h)

Результат выполнения данного кода будет следующим:

Quack Flap Trying to Quack like a duck Spreading my arm to flap like a duck

Поскольку Duck и Human это разные классы, Python повторно вызывает функцию fly_quack() для экземпляра класса Human . И хотя класс Human имеет похожие методы quack и fly , типы объектов были разными и поэтому все работает правильно и вызываются верные методы.

Подсказки типов и модуль mypy

У динамически типизированных языков, таких как Python, есть свои мощные преимущества, но есть и некоторые недостатки. Одним из недостатков является возникновение ошибок выполнения (runtime error) когда Python не производит принудительного преобразования типов. В результате могут возникать баги, которые с увеличением длины кода становится все трудней найти.

Подсказки типов реализованы в Python начиная с версии 3.5. А более старые версии могут не поддерживать данный функционал.

Давайте посмотрим простой пример без подсказок типов и модуля mypy.

Данная функция предназначена для вычитания целочисленных значений. Она принимает на вход два целых числа и возвращает их разность.

def sub_this(x,y): return 'Subtraction' print(sub_this(8,'hello'))

Здесь функция должна принимать два целых числа x и y , но, поскольку никаких ограничений не наложено, она может принимать переменные любого типа данных. Также надо заметить, что данная функция вернет значение ‘Subtraction’ при любых входных данных, а нам бы хотелось видеть целочисленное значение.

Давайте рассмотрим выполнение данного кода с подсказками и модулем mypy . С его помощью можно реализовать проверку статических типов и легко уменьшить количество ошибок в программе.

mypy — это модуль Python, который помогает в проверке статических типов. Он использует собственную динамическую проверку Python или неявную («утиную») типизацию с подсказкой самого типа.

Для начала вам нужно установить сам модуль mypy:

pip install mypy

Далее вам нужно создать файл с именем mypy_example.py на своем локальном компьютере и сохранить туда следующий код:

def sub_this(x:int,y:int) -> int: return 'Subtracted two integers' print(sub_this(8,4))

Это простая программа, которая принимает два целых числа в качестве входных данных в параметре, а после ‘->’ показывает тип возвращаемых данных, который также является целочисленным (‘int’). Но хотя функция должна возвращать целочисленное значение (int), возвращается строка ‘Subtracted two integers’.

Запустите указанный выше код в терминале следующим образом:

mypy mypy_example.py

После этого будет показана ошибка, указывающая на несоответствие типов (должен быть ‘int», а выдается ‘str’).

Давайте теперь изменим тип возвращаемого значения. Заменим строковое значение на разницу двух целых чисел. Таким образом, будет возвращаться целочисленное значение.

def sub_this(x:int,y:int) -> int: return x - y print(sub_this(8,4))

Мы видим, что программа выполняется успешно, никаких проблем не обнаружено.

Поздравляем!

Дочитав эту статью до конца, вы познакомились с проверкой типов и узнали о разных системах типизации в разных языках программирования. Также вы познакомились с методами type() и isinstance() языка Python и с неявной («утиной») типизации. Еще вы узнали о подсказках типов и модуле mypy .

Узнать тип type() и проверить тип isinstance()

В Python у нас утиная динамическая типизация, поэтому бывает что нужно узнать тип переменной. Функция type() возвращает тип аргумента или, учитывая, что в Python – все класс, то класс аргумента. Результат можно сравнить с известным типом:

>>> i, s = 10, "hello" >>> type(i) >>> type(i) is int True >>> type(s) is str True >>> class A: pass . >>> a = A() >>> type(a) is A True

Можно создать экземпляр объекта того же класса, что и переменная:

>>> new_a = type(a)() >>> type(new_a) == type(a) True

⚠️ Нужно знать! type() не принимает во внимание наследование. Тип наследника отличается от типа родителя:

>>> class B(A): pass . >>> type(A()) is type(B()) False

Лучший способ проверить типы – функция isinstance(x, type) (instance англ. – экземпляр). Она возвращает True, если первый аргумент является экземпляром класса во втором аргументе:

>>> isinstance(i, int) True >>> isinstance(s, str) True >>> isinstance(a, A) True

Функция поддерживает наследование:

class A: pass class B(A): pass b = B() >>> isinstance(b, A) True

И самое крутое: вторым аргументом допускается передать кортеж из типов, и isinstance вернет True , если хоть один из типов в кортеже подходит:

>>> isinstance(i, (int, float)) True >>> isinstance(a, (A, B)) True
class A: . a = A() class A: . print(isinstance(a, A))

Правильный ответ был False!

Объяснение. Динамическая натура Python позволяет переопределить класс во время интерпретации. Помните, как недавно я рассказывал про декораторы класса? Там мы подменяли один класс другим. Вот это из той же оперы. Тут мы подменили один класс, другим классом, отвязав имя А от старого класса и привязав его к новому. Старый класс А остался жив только как класс объекта в переменной a . Старого и нового классов разные адреса ( id ):

class A: . print(id(A)) # 140479777819720 a = A() class A: . print(id(A)) # 140479777809672 isinstance(a, A) # False

Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway ��

#4 – Переменные и типы данных в Python

#4 – Переменные и типы данных в Python

Переменные являются важной частью любого языка программирования. В ходе урока мы научимся создавать переменные и выполнять различные действия над ними. Помимо этого мы изучим типы данных что существуют в языке Python.

Видеоурок

Переменные невероятно важны, так как позволяют хранить информацию и использовать её в дальнейшем. Вначале может быть не совсем понятно зачем вообще что-то записывать в переменную, если можно просто оперировать значениями без них. Понимание переменных придет немного позже, когда мы начнем создавать более сложные программы и нам потребуется хранить информацию в каком-либо месте.

Типы переменных в языке Python не объявляются очевидно, тем не менее они присутствуют. Интерпретатор понимает что записывается в переменную и на основании этого добавляет тип к этой переменной.

Во время выполнения программы есть возможность перезаписывать переменные, а также менять их тип. Если вначале переменна была с типом float, то потом её можно преобразовать в другой тип, к примеру, в string.

first_num = 23.2 # Тип данных float first_num = "1" # Тип данных string

При объединение нескольких переменных с разными типами данных программа спровоцирует ошибку.

first_num = "IloveYou" second_num = 13 res = first_num + second_num # Скрипт выдаст ошибку
  • some = 1 Integer — целые числа;
  • some = 1.12 Float — числа с плавающей точкой;
  • some = «Привет» String — строки;
  • some = True Boolean — тип данных принимающий либо False, либо True.

В одной строке можно создать сразу несколько переменных:

first = sec = third = 1 # Всем трём переменным будет присвоено значение 1 first, sec, third = "Hi", 75, 23.1 # Поочередное присвоение значений

Переменные и работа с ними

number = 5 # int digit = -4.54356876 # float word = "Результат:" # string boolean = True # bool str_num = '5' # string # print(word + str(digit)) print(word + str(number + int(str_num))) del number number = 7 print("Результат:", number)
Посмотреть остальной код можно после подписки на проект!

Задание к уроку

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

Большое задание по курсу

Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца

Как узнать тип переменной в PyCharm Python

В python узнать тип переменной a можно, вписав команду print(type(a)) . Можно ли в PyCharm узнать тип переменной, наведя на неё мышкой или другим быстрым способом, не набирая строки кода для каждой переменной?

Отслеживать
4,061 1 1 золотой знак 10 10 серебряных знаков 36 36 бронзовых знаков
задан 17 июн 2021 в 22:54
konstantinmakovsky konstantinmakovsky
61 1 1 серебряный знак 6 6 бронзовых знаков
Можно использовать дебаггер в PyCharm и его панель с переменными (jetbrains.com/help/pycharm/…)
17 июн 2021 в 23:19

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Ставишь каретку на переменную -> Ctrl+Shift+P (View -> Type Info). Если не сможет вывести тип будет Any .

type hint popup in PyCharm

Отслеживать
ответ дан 18 июн 2021 в 10:33
Pavel Karateev Pavel Karateev
1,967 1 1 золотой знак 12 12 серебряных знаков 16 16 бронзовых знаков
А не, действительно не так работает, как если просто мышкой навести.
19 июн 2021 в 9:10

Можно использовать типизацию и модуль typing для более сложных типов.

Как пример имеем функцию с описанными типами переменных (их описывать можно не только в функции). PyCharm будет понимать, какая переменная кем является, и предлагать методы для этого типа. Спомощью модуля typing можно описать какие ожидаются элементы внутри iterable объектов, Union типы (когда несколько типов может быть) и тд.

Понимает что переменная строка и предлагает методы для строки.

Понимает что переменная строка и предлагает методы для строки.

Понимает что перменная dict и показывает методы для него

Понимает что переменная dict и показывает методы для него

Понимает что ключ переменно - tuple и показывает методы для него.

Понимает что ключ переменно — tuple и показывает методы для него. и тд

Так же если ввести в функцию недопустимые типы, PyCharm подскажет Вам.

С собственной структурой, аналогично знает что это за переменная и предлагает её атрибуты.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *