Определение типа объекта в Python: строка или Unicode

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы провести быструю проверку, является ли объект строкой, уместно использовать функцию isinstance(). Примените ее следующим образом к переменной my_var:

Python
Скопировать код
is_string = isinstance(my_var, str)

Если вы получите True, это означает, что my_var действительно является строкой. В случае значения False мы можем сделать вывод, что это не так.

Кинга Идем в IT: пошаговый план для смены профессии

Разбираемся в isinstance() и проверке строк

Если перед вами стоит задача проверить, является ли переменная строкой, функция isinstance() станет для вас надежным инструментом. Ее основное преимущество заключается в способности распознавать подклассы. Посмотрим на пример, когда вы определили свой тип строки:

Python
Скопировать код
class CustomString(str):  # Новая версия типа str
    pass

custom_str = CustomString("Да, я тоже строка!")

# isinstance() распознает подлинный тип
print(isinstance(custom_str, str))  # Выводит: True

В то время как функция type() не воспринимает объект подкласса как экземпляр базового класса:

Python
Скопировать код
# К сожалению, для type() custom_str — не традиционная строка
print(type(custom_str) is str)  # Выводит: False

Python 2 против Python 3

Если вы все еще работаете с Python 2, вместо str используйте basestring:

Python
Скопировать код
# Python 2:
is_string = isinstance(my_var, basestring)

Однако, учитывая, что мы живем в 2022 году и Python 2 уже даже не поддерживается, для работы со строками в Python 3 рекомендуется использовать str. Если вам требуется поддерживать оба варианта, можно воспользоваться six:

Python
Скопировать код
from six import string_types
is_string = isinstance(my_var, string_types)

Есть ли альтернативы для определения строк?

Знакомьтесь: Duck typing

Если этот объект ведет себя как строка — значит, это и есть строка. Концепция Duck typing основана на том, что поведение объекта важнее его непосредственного типа:

Python
Скопировать код
try:
    is_string_like = hasattr(my_var, "split") и callable(my_var.split)
except AttributeError:
    is_string_like = False

Использование библиотеки 'six'

Модуль six обеспечивает совместимость вашего кода с Python 2 и Python 3:

Python
Скопировать код
from six import string_types
is_string = isinstance(my_var, string_types)

Переход в мир Python с помощью 2to3

Если вы осуществляете переход с Python 2 на 3, функционал 2to3 поможет автоматически заменить устаревшие basestring на актуальные str:

Bash
Скопировать код
2to3 -w my_entire_code_that_was_written_in_ancient_times.py

Визуализация

Представьте себе, что вы проводите проверку багажа с помощью рентгена для обнаружения строк:

Markdown
Скопировать код
| Объект Python (Багаж)    | Строка? (Рентген)                |
| ----------------------- | -----------------------------   |
| "Привет, мир!" (👜)       | ✅ (👕)                            |
| 42 (🧳)                  | ❌ (🔧)                             |
| [1, 'два', 3] (🎒)        | ❌ (📚👕📘)                         |

Принцип работы isinstance():

Python
Скопировать код
if isinstance(obj, str):  # Если "рентген" показывает "одежду"
    return True  # То это строка! Чемодан прошел проверку
return False  # К сожалению, это не строка...

🛂= проверка isinstance, 👕= строка, 🏷️= Строка прошла проверку, 🚫= Не строка

Что важно помнить при проверке типа?

Динамическая типизация в Python

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

Python 3 и единство Unicode

Python 3 устранил разницу между обычными и юникодными строками, теперь все они — str, что заметно облегчает работу с текстовыми данными.

Словарь Python к вашим услугам

Чтобы всегда иметь быстрый доступ к лучшим практикам работы с Python, разместите в закладках его словарь.

Когда не стоит использовать isinstance()

Если поведение объекта важнее его типа, вместо isinstance() используйте принципы duck typing.

Полезные материалы

  1. Встроенные функции — Документация Python 3.12.1 — подробности о функции isinstance() в официальной документации.
  2. Встроенные типы — Документация Python 3.12.1 — информация о строках в Python.
  3. python – В чем разница между строкой и байтовой строкой? – Stack Overflow — статья о различии между str и bytes в Python 3.
  4. python – В чем разница между type() и isinstance()? – Stack Overflow — обсуждение отличий между type() и isinstance() на Stack Overflow.
  5. 3. Неофициальное введение в Python — Документация Python 3.12.1 — вводный курс по работе со строками в Python для начинающих.
  6. Строки – Глубокое погружение в Python 3 — подробный материал для изучения строк в Python 3.
  7. Методы строк Python — подробный список методов для работы со строками от W3Schools.
  8. PEP 498 – Литеральные форматные строки — описание литеральных форматных строк в Python 3.6.