Как я могу проверить, является ли объект Python строкой (обычной или Unicode)?
python
string
types
compatibility
Мэтт С.
источник
источник
Ответы:
Python 2
Используйте
isinstance(obj, basestring)
для объекта для проверкиobj
.Docs .
источник
Python 2
Чтобы проверить, является ли объект
o
строковым типом подкласса строкового типа:потому что оба
str
иunicode
являются подклассамиbasestring
.Чтобы проверить, является ли тип
o
точноstr
:Чтобы проверить,
o
является ли экземплярstr
или любой подклассstr
:Вышеприведенное также работает для строк Unicode, если вы замените их
str
наunicode
.Тем не менее, вам может не потребоваться делать явную проверку типов вообще. «Утиная печать» может соответствовать вашим потребностям. См. Http://docs.python.org/glossary.html#term-duck-typing .
Смотрите также Что такое канонический способ проверки типа в python?
источник
basestring
в py2.Python 3
В Python 3.x
basestring
больше нет, так какstr
это единственный тип строки (с семантикой Python 2.xunicode
).Таким образом, проверка в Python 3.x является просто:
Это следует за исправлением официального
2to3
инструмента конвертации: конвертацияbasestring
вstr
.источник
Python 2 и 3
(Кросс-совместимый)
Если вы хотите проверить, не обращая внимания на версию Python (2.x против 3.x), используйте
six
( PyPI ) и егоstring_types
атрибут:Внутри
six
(очень легкий однофайловый модуль) он просто делает это :источник
future
( PyPI ), чтобы даже сохранить имя:from past.builtins import basestring
basestring
а затем вернитесь кstr
. Напримерdef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Я нашел это и многое другое
pythonic
:поскольку объекты типа являются синглтоном, это может использоваться , чтобы сделать сравнение объекта с типом ули
источник
isinstance(obj_to_test, str)
очевидно, он предназначен для проверки на тип и имеет преимущество в использовании той же процедуры, что и в других, не относящихся к делу случаях.Если кто-то хочет избежать явной проверки типов (и для этого есть веские причины), возможно, самая безопасная часть строкового протокола для проверки:
Это не итерация через итератор или итератор, он не будет вызывать список-оф-строки в строку , и это правильно обнаруживает струноподобный в виде строки.
Конечно, есть и недостатки. Например,
str(maybe_string)
может быть тяжелый расчет. Как часто, ответ - это зависит .РЕДАКТИРОВАТЬ: Как @Tcll указывает в комментариях, вопрос на самом деле просит способ обнаружить как строки Unicode, так и строки байтов. В Python 2 этот ответ не удастся, за исключением строк Unicode, которые содержат символы не ASCII, а в Python 3 он вернется
False
для всех строк байтов.источник
b = b'test'; r = str(b) == b
гдеb
хранятся те же данные, что и,str(b)
но (будучи объектом байтов) не проверяется как строка.Чтобы проверить, является ли ваша переменная чем-то похожим:
Вывод isistance выдаст вам логическое значение True или False, чтобы вы могли соответственно отрегулировать. Вы можете проверить ожидаемую аббревиатуру вашего значения, первоначально используя: type (s). Это вернет вам тип 'str', чтобы вы могли использовать его в функции isistance.
источник
Я мог бы иметь дело с этим в стиле печати утки, как другие упоминают. Как я узнаю, что строка действительно является строкой? ну, очевидно, преобразовав его в строку!
Если arg уже является строковым или юникодным типом, real_word будет хранить его значение без изменений. Если переданный объект реализует
__unicode__
метод, который используется для получения его представления в юникоде. Если переданный объект не может использоваться как строка,unicode
встроенная функция вызывает исключение.источник
будет True, если ваш объект действительно является строковым типом. «str» - зарезервированное слово
мои извинения, правильный ответ использует 'basestring' вместо 'str' для того, чтобы он также включал строки Unicode - как было отмечено выше одним из других респондентов.
источник
Этим вечером я столкнулся с ситуацией, в которой я думал, что должен будет проверить
str
тип, но оказалось, что я не сделал.Мой подход к решению проблемы, вероятно, будет работать во многих ситуациях, поэтому я предлагаю его ниже на тот случай, если другие, читающие этот вопрос, будут заинтересованы (только Python 3).
Некоторые тесты:
источник
Это просто, используйте следующий код (мы предполагаем, что упомянутый объект является obj) -
источник
Вы можете проверить это путем объединения с пустой строкой:
Редактировать :
Исправление моего ответа после комментариев, указывающих, что это не удается со списками
источник
Для хорошего подхода к типизации уток для подобных строк, у которого есть бонус работы с Python 2.x и 3.x:
Wisefish был близок к тому, чтобы печатать на утке, прежде чем он переключился на
isinstance
подход, за исключением того, что он+=
имеет другое значение для списков, чем+
делает.источник
isalpha
, но кто знает, какие методы было бы безопасно искать?__str__
метод плюс равенство на самом деле может быть надежным. Но даже это не без предостережений.try
может быть быстрее. Если вы ожидаете это в 99% случаев, возможно, нет. Разница в производительности минимальна, лучше быть идиоматичным, если вы не профилируете свой код и не определите, что он действительно медленный.от EDX - онлайн курс MITx: 6.00.1x Введение в информатику и программирование с использованием Python
источник
str
!