Определение типа объекта в Python: строка или Unicode
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы провести быструю проверку, является ли объект строкой, уместно использовать функцию isinstance()
. Примените ее следующим образом к переменной my_var
:
is_string = isinstance(my_var, str)
Если вы получите True
, это означает, что my_var
действительно является строкой. В случае значения False
мы можем сделать вывод, что это не так.
Разбираемся в isinstance() и проверке строк
Если перед вами стоит задача проверить, является ли переменная строкой, функция isinstance()
станет для вас надежным инструментом. Ее основное преимущество заключается в способности распознавать подклассы. Посмотрим на пример, когда вы определили свой тип строки:
class CustomString(str): # Новая версия типа str
pass
custom_str = CustomString("Да, я тоже строка!")
# isinstance() распознает подлинный тип
print(isinstance(custom_str, str)) # Выводит: True
В то время как функция type()
не воспринимает объект подкласса как экземпляр базового класса:
# К сожалению, для type() custom_str — не традиционная строка
print(type(custom_str) is str) # Выводит: False
Python 2 против Python 3
Если вы все еще работаете с Python 2, вместо str
используйте basestring
:
# Python 2:
is_string = isinstance(my_var, basestring)
Однако, учитывая, что мы живем в 2022 году и Python 2 уже даже не поддерживается, для работы со строками в Python 3 рекомендуется использовать str
. Если вам требуется поддерживать оба варианта, можно воспользоваться six
:
from six import string_types
is_string = isinstance(my_var, string_types)
Есть ли альтернативы для определения строк?
Знакомьтесь: Duck typing
Если этот объект ведет себя как строка — значит, это и есть строка. Концепция Duck typing основана на том, что поведение объекта важнее его непосредственного типа:
try:
is_string_like = hasattr(my_var, "split") и callable(my_var.split)
except AttributeError:
is_string_like = False
Использование библиотеки 'six'
Модуль six
обеспечивает совместимость вашего кода с Python 2 и Python 3:
from six import string_types
is_string = isinstance(my_var, string_types)
Переход в мир Python с помощью 2to3
Если вы осуществляете переход с Python 2 на 3, функционал 2to3
поможет автоматически заменить устаревшие basestring
на актуальные str
:
2to3 -w my_entire_code_that_was_written_in_ancient_times.py
Визуализация
Представьте себе, что вы проводите проверку багажа с помощью рентгена для обнаружения строк:
| Объект Python (Багаж) | Строка? (Рентген) |
| ----------------------- | ----------------------------- |
| "Привет, мир!" (👜) | ✅ (👕) |
| 42 (🧳) | ❌ (🔧) |
| [1, 'два', 3] (🎒) | ❌ (📚👕📘) |
Принцип работы isinstance()
:
if isinstance(obj, str): # Если "рентген" показывает "одежду"
return True # То это строка! Чемодан прошел проверку
return False # К сожалению, это не строка...
🛂= проверка isinstance, 👕= строка, 🏷️= Строка прошла проверку, 🚫= Не строка
Что важно помнить при проверке типа?
Динамическая типизация в Python
Python — язык с динамической типизацией, где isinstance()
позволяет проверять типы объектов "на лету". Однако злоупотреблять такими проверками не следует, многие разработчики предпочитают опираться на поведение объектов, а не на их типы.
Python 3 и единство Unicode
Python 3 устранил разницу между обычными и юникодными строками, теперь все они — str
, что заметно облегчает работу с текстовыми данными.
Словарь Python к вашим услугам
Чтобы всегда иметь быстрый доступ к лучшим практикам работы с Python, разместите в закладках его словарь.
Когда не стоит использовать isinstance()
Если поведение объекта важнее его типа, вместо isinstance()
используйте принципы duck typing.
Полезные материалы
- Встроенные функции — Документация Python 3.12.1 — подробности о функции
isinstance()
в официальной документации. - Встроенные типы — Документация Python 3.12.1 — информация о строках в Python.
- python – В чем разница между строкой и байтовой строкой? – Stack Overflow — статья о различии между
str
иbytes
в Python 3. - python – В чем разница между type() и isinstance()? – Stack Overflow — обсуждение отличий между
type()
иisinstance()
на Stack Overflow. - 3. Неофициальное введение в Python — Документация Python 3.12.1 — вводный курс по работе со строками в Python для начинающих.
- Строки – Глубокое погружение в Python 3 — подробный материал для изучения строк в Python 3.
- Методы строк Python — подробный список методов для работы со строками от W3Schools.
- PEP 498 – Литеральные форматные строки — описание литеральных форматных строк в Python 3.6.