Как проверить переменную на тип str в Python 3?
Привет всем. В процессе написания программы на Python 3 потребовалось проверить переменную на тип str (то есть узнать, принадлежит ли переменная типу string ) Пробовал конструкцию try — except , но в данном случае ошибки не происходит, не смотря на то, что переменная может являтся любого типа (ну или почти любого). Пробовал также вот такое условие:
if type(*имя переменной*) != : :
Но из этого тоже ничего не выходит. Выдает ошибку:
if type(*имя переменной*) != : ^ SyntaxError: invalid syntax
- В чем ошибка и можно ли её устранить?
- Если нет, то какие существуют способы решения задачи?
- Можно ли осуществлять такую проверку на другие типы переменных?
P.S. Заранее извиняюсь, если этот вопрос дубликат. В таком случаее попрощу дать ссылки на ответы, сам вопрос могу удалить (если ответы решат мою проблему)
Узнать тип 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
Как узнать тип переменной 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’ , ‘eth1.ru’ ] var_tuple = ( ‘eth1.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’ , ‘eth1.ru’ ] var_tuple = ( ‘eth1.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’, ‘eth1.ru’] is list (‘eth1.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»)
Протестируем нашу функцию
var_list is list
Принадлежность к одному из нескольких типов
Если нужно проверить принадлежит ли объект не к какому-то одному, а к группе типов, эти типы можно перечислить в скобках.
Часто бывает нужно проверить является ли объект числом, то есть подойдёт как int, так и float
print ( isinstance ( 2.0 , ( int , float )))
Проверим несколько значений из списка
l3 = [ 1.5 , — 2 , «www.heihei.ru» ] for item in l3: print ( isinstance (item, ( int , float )))
True
True
False

Проверка списка или другого 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()
Проверка типа данных в Python — 4 лучших инструмента

С самого начала типы данных в Python не обозначались. Это отвечало общей цели сделать язык быстрым и простым для работы. Ведь гибкие типы объектов позволяют разработчикам использовать различные уловки при написании кода, делающие его короче.
Сам «змеиный» язык не проверяет типы при выполнении кода — по крайней мере, пока. Но за последние годы в Python появилась поддержка аннотации типов. Это породило создание целой серии ПО, занятого проверкой типов на этапе разработки.
Дополнив привычную среду разработки (IDE) хорошим инструментом проверки типов, можно использовать аннотации типов Python, чтобы отсеять многие часто возникающие ошибки до релиза.
В этой статье мы рассмотрим четыре основных модуля проверки типов данных для Python. Все они реализованы примерно одинаково — сканируют код Python с аннотациями типов и дают обратную связь. Но каждое прилагает к такой базе свои полезные дополнения.
Что такое типизация
До того как рассматривать те или иные средства, с помощью которых осуществляется проверка типа данных, следует кратко рассмотреть саму типизацию и её применение в Python.
Разработчик вносит информацию в переменные/функции/их аргументы. Свойства записанных данных определяются путём присваивания определённого типа. А то, как взаимодействует с типами данных язык программирования, называется типизацией.
Виды типизации в Python
- Динамическая. Определение типа переменных происходит при выполнении программы. Разработчику не нужно точно присваивать тип переменной, как такое происходит при статической типизации.
- Неявная. Разработчику не требуется явно указывать типы данных, за это отвечает компилятор/интерпретатор.
- Строгая. Python не позволяет смешивать типы данных. Если разработчик совершит ошибку (например, попытается сложить строку и целое число), то интерпретатор выдаст ошибку.
Проверка типа в Python
Python поддерживает аннотацию типов – указание типов данных, как и при статической типизации. Использованные разработчиком инструкции не будут считываться интерпретатором, но помогут при работе со статическими анализаторами кода для проверки типов Python.
Преимущества аннотации типов данных
- Повышение читабельности и общего качества кода. Программист не путается в типах данных, так как они явно указаны в коде.
- Обнаружение ошибок. При использовании анализатора все ошибки будут заранее указываться в консольной версии программы или в используемом IDE.
- Облегчение конечной проверки кода. Проверка типов позволяет исключить использование модульных тестов, что ускоряет процесс разработки.
Лучшие инструменты проверки типа данных
Mypy

Mypy может считаться самым первым инструментом проверки типов данных для Python. Работа над библиотекой началась в 2012 году, и её до сих пор активно развивают. Mypy стала прототипом для других подобных сторонних библиотек в Python, хотя с тех пор появилось и немало новых инструментов, расширивших её функции.
Инструмент Mypy можно запустить отдельно или из командной строки. Его также можно сделать частью редактора или встроить в IDE в роли средства контроля кода (линтера).
Поддержка
Многие IDE и редакторы имеют встроенную поддержку Mypy. Модуль Python для Visual Studio Code тоже может работать с системой напрямую. При запуске Mypy создаёт отчёт о согласованности кода на основе почерпнутой из него информации о типах данных.
Если код не поддерживает аннотации типов, Mypy не выполнит львиной доли проверок из своего арсенала. Но инструмент можно также использовать, чтобы сделать определение типа без аннотации. Сделать это можно с помощью нескольких степеней строгости проверки на тип данных, в зависимости от целей.
Принципы работы
Если начинать базу исходного кода с нуля и превентивно следовать жёсткой стратегии линтинга (статистического анализа кода), опция « —strict » не разрешит любой код без типизации.
Но предположим, что мы работаем с унаследованным кодом, в котором объявлений типов немного. Тогда подойдут более мягкие варианты. Например, можно запретить только определения функций без объявления типа, используя опцию « —disallow-untyped-defs » и допуская другой нетипизированный код. Кроме того, всегда можно оградить отдельные строки от проверки внутристрочными комментариями вида « # type: ignore ».
Файлы заглушки
Mypy позволяет задействовать stub-файлы (заглушки), предусмотренные документом PEP 484, и использовать аннотации типов для публичных интерфейсов модулей. К тому же, в Mypy доступен специальный плагин stubgen. Этот инструмент автоматически создаёт stub-файлы на основе имеющегося кода.
Для нетипизированного кода stub-файлы будут содержать универсальные типы (дженерики), которые затем можно разметить нужным образом.
Pytype

Инструмент Pytype, созданный Google, отличается от Mypy использованием так называемого «вывода типов» (inference), вместо обычного дескрипторов типа. Это значит, что Pytype пытается определить типы путём анализа потока кода, а не полагается исключительно на аннотации.
Принципы работы
Везде, где это имеет смысл, Pytype проявляет снисходительность. Если есть операция, которая при выполнении нормально работает и не противоречит аннотациям, то Pytype не будет препятствовать процессу.
Но это также значит, что проблемы, на которые следовало бы указать, замечены не будут. Например, объявление переменной с типом и затем её переобъявление в том же контексте.
Функционал
Для добавления в код аннотации типов особенно пригодится такая функция Pytype, как « reveal_type ». Если добавить в код выражение « reveal_type(expr) », то Pytype установит тип «e xpr » и выдаст предупреждение, в котором он будет указан.
Обращаем внимание. Некоторые характеристики Pytype управляются вставкой атрибутов в сам код. Например, чтобы Pytype прекратил жалобы на отсутствующие динамические атрибуты или модули, нужно не менять что-то в метаданных конфигурации, а добавить атрибут «_HAS_DYNAMIC_ATTRIBUTES = True» в нужные классы или модули.
Pyright

Pyright — средство проверки типов данных для Python от Microsoft. Он присутствует в Visual Studio Code как часть Pylance — бесплатного модуля языкового сервера Python. Этот многофункциональный инструмент Python — проверка типов сочетается в нём с линтингом кода.
Принципы работы
Как и Pytype, Pyright может работать с базами исходного кода, которые не имеют информацию о типах. В таких случаях Pyright постарается выполнить вывод «используемых типов» (type inference).
Можно получить неплохой результат с Pytype на старом коде без объявления типов. Но со временем можно выиграть больше, если последовательно снабдить код аннотациями типов.
Функционал
Как и другие инструменты проверки типов данных, Pyright можно настраивать по-разному для каждого проекта. Для этого используют файл конфигурации в формате JSON в каталоге проекта. В этом файле отдельные пути могут исключаться (никогда не проверяться) или игнорироваться (ошибки и предупреждения будут скрыты).
В VS Code «рабочие области» (workspace) с несколькими корневыми каталогами могут использовать отдельные конфигурации Pyright, если разные части проекта требуют особой настройки линтинга.
Ещё можно определить внутри проекта несколько «сред выполнения» (execution environment). Каждая получит своё «виртуальное окружение» (venv) или «путь импорта» (import path).
Pyre

Pyre создан разработчиками Facebook и Instagram. По сути, это два инструмента в одном:
- система проверки типов (Pyre);
- средство статистического анализа кода (Pysa).
Оба созданы для совместной работы, чтобы обеспечить более высокий уровень проверки и анализа, чем другие инструменты. Однако, чтобы получить все преимущества, пользователь должен приложить немного усилий.
Принципы работы
Подход Pyre аналогичен Pytype и Mypy. С кодом без типизации данных программа обращается снисходительней, чем с типизированным. Поэтому можно взять нетипизированный код и добавлять в Python аннотации пошагово: функцию за функцией, модуль за модулем.
Если включить «строгий режим» (strict mode), Pyre отметит все пропущенные аннотации. Можно также выставить строгий режим по умолчанию, отключая его на уровне модулей. Pyre работает и со stub-файлами в формате «.pyi».
Функционал
У Pyre есть мощная функция для миграции баз исходного кода в типизированный формат. С опцией командной строки « infer » программа берёт файл или каталог, делает эмпирические предположения об использованных типах и применяет полученные аннотации к файлам.
Но перед этим стоит сделать их резервную копию. Если нужна информация о типах для выполняемой программы Python, у Facebook/Instagram есть для этого другой сервис — MonkeyType.
Особенности Pysa
По функциям инструмент Pyre аналогичен другим рассмотренным пакетам, но Pysa имеет свои уникальные преимущества. Этот модуль проверки выполняет для кода taint-анализ — ищет возможные проблемы безопасности. Pysa использует библиотеку потокового анализа определённых программных компонентов, после чего отмечает потенциально уязвимый код.
Всё, что связано с этим кодом, будет отмечено как «загрязнённое» (tainted). Впрочем, можно указать компоненты, которые обеспечат безопасность данных, убрав такие данные из «диаграммы загрязнения» (taint graph).
Недостаток в том, что библиотека Pysa для taint-анализа сторонних компонентов всё ещё мала. Поэтому может потребоваться создание собственной модели.
Однако, в этой библиотеке уже содержатся модели taint-анализа наиболее распространённого ПО. Например, в этот перечень входит веб-фреймворк Django, ORM-библиотека SQL Alchemy, библиотека анализа данных Pandas.
Нужна надёжная база для разработки программных продуктов? Выбирайте виртуальные сервера от Eternalhost с технической поддержкой 24/7 и бесплатной защитой от DDoS!