Как я могу проверить, является ли объект Python строкой (обычной или Unicode)?
Как я могу проверить, является ли объект Python строкой (обычной или Unicode)?
Ответы:
Чтобы проверить, является ли объект o
строковым типом подкласса строкового типа:
isinstance(o, basestring)
потому что оба str
и unicode
являются подклассами basestring
.
Чтобы проверить, является ли тип o
точно str
:
type(o) is str
Чтобы проверить, o
является ли экземпляр str
или любой подкласс str
:
isinstance(o, str)
Вышеприведенное также работает для строк Unicode, если вы замените их str
на unicode
.
Тем не менее, вам может не потребоваться делать явную проверку типов вообще. «Утиная печать» может соответствовать вашим потребностям. См. Http://docs.python.org/glossary.html#term-duck-typing .
Смотрите также Что такое канонический способ проверки типа в python?
basestring
в py2.
В Python 3.x basestring
больше нет, так как str
это единственный тип строки (с семантикой Python 2.x unicode
).
Таким образом, проверка в Python 3.x является просто:
isinstance(obj_to_test, str)
Это следует за исправлением официального 2to3
инструмента конвертации: конвертация basestring
в str
.
Если вы хотите проверить, не обращая внимания на версию Python (2.x против 3.x), используйте six
( PyPI ) и его string_types
атрибут:
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
Внутри six
(очень легкий однофайловый модуль) он просто делает это :
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
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
:
if type(aObject) is str:
#do your stuff here
pass
поскольку объекты типа являются синглтоном, это может использоваться , чтобы сделать сравнение объекта с типом ули
isinstance(obj_to_test, str)
очевидно, он предназначен для проверки на тип и имеет преимущество в использовании той же процедуры, что и в других, не относящихся к делу случаях.
Если кто-то хочет избежать явной проверки типов (и для этого есть веские причины), возможно, самая безопасная часть строкового протокола для проверки:
str(maybe_string) == maybe_string
Это не итерация через итератор или итератор, он не будет вызывать список-оф-строки в строку , и это правильно обнаруживает струноподобный в виде строки.
Конечно, есть и недостатки. Например, str(maybe_string)
может быть тяжелый расчет. Как часто, ответ - это зависит .
РЕДАКТИРОВАТЬ: Как @Tcll указывает в комментариях, вопрос на самом деле просит способ обнаружить как строки Unicode, так и строки байтов. В Python 2 этот ответ не удастся, за исключением строк Unicode, которые содержат символы не ASCII, а в Python 3 он вернется False
для всех строк байтов.
b = b'test'; r = str(b) == b
где b
хранятся те же данные, что и, str(b)
но (будучи объектом байтов) не проверяется как строка.
Чтобы проверить, является ли ваша переменная чем-то похожим:
s='Hello World'
if isinstance(s,str):
#do something here,
Вывод isistance выдаст вам логическое значение True или False, чтобы вы могли соответственно отрегулировать. Вы можете проверить ожидаемую аббревиатуру вашего значения, первоначально используя: type (s). Это вернет вам тип 'str', чтобы вы могли использовать его в функции isistance.
Я мог бы иметь дело с этим в стиле печати утки, как другие упоминают. Как я узнаю, что строка действительно является строкой? ну, очевидно, преобразовав его в строку!
def myfunc(word):
word = unicode(word)
...
Если arg уже является строковым или юникодным типом, real_word будет хранить его значение без изменений. Если переданный объект реализует __unicode__
метод, который используется для получения его представления в юникоде. Если переданный объект не может использоваться как строка, unicode
встроенная функция вызывает исключение.
isinstance(your_object, basestring)
будет True, если ваш объект действительно является строковым типом. «str» - зарезервированное слово
мои извинения, правильный ответ использует 'basestring' вместо 'str' для того, чтобы он также включал строки Unicode - как было отмечено выше одним из других респондентов.
Этим вечером я столкнулся с ситуацией, в которой я думал, что должен будет проверить str
тип, но оказалось, что я не сделал.
Мой подход к решению проблемы, вероятно, будет работать во многих ситуациях, поэтому я предлагаю его ниже на тот случай, если другие, читающие этот вопрос, будут заинтересованы (только Python 3).
# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
'''Take a field sequence definition and yield from a validated
field sequence. Accepts a string, a string with separators,
or a sequence of strings'''
if fields:
try:
# single unpack in the case of a single argument
fieldseq, = fields
try:
# convert to string sequence if string
fieldseq = fieldseq.split(sep)
except AttributeError:
# not a string; assume other iterable
pass
except ValueError:
# not a single argument and not a string
fieldseq = fields
invalid_fields = [field for field in fieldseq if not validator(field)]
if invalid_fields:
raise ValueError('One or more field names is invalid:\n'
'{!r}'.format(invalid_fields))
else:
raise ValueError('No fields were provided')
try:
yield from fieldseq
except TypeError as e:
raise ValueError('Single field argument must be a string'
'or an interable') from e
Некоторые тесты:
from . import getfields
def test_getfields_novalidation():
result = ['a', 'b']
assert list(getfields('a b')) == result
assert list(getfields('a,b', sep=',')) == result
assert list(getfields('a', 'b')) == result
assert list(getfields(['a', 'b'])) == result
Это просто, используйте следующий код (мы предполагаем, что упомянутый объект является obj) -
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
Вы можете проверить это путем объединения с пустой строкой:
def is_string(s):
try:
s += ''
except:
return False
return True
Редактировать :
Исправление моего ответа после комментариев, указывающих, что это не удается со списками
def is_string(s):
return isinstance(s, basestring)
Для хорошего подхода к типизации уток для подобных строк, у которого есть бонус работы с Python 2.x и 3.x:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
Wisefish был близок к тому, чтобы печатать на утке, прежде чем он переключился на isinstance
подход, за исключением того, что он +=
имеет другое значение для списков, чем +
делает.
isalpha
, но кто знает, какие методы было бы безопасно искать?
try
может быть быстрее. Если вы ожидаете это в 99% случаев, возможно, нет. Разница в производительности минимальна, лучше быть идиоматичным, если вы не профилируете свой код и не определите, что он действительно медленный.
if type(varA) == str or type(varB) == str:
print 'string involved'
от EDX - онлайн курс MITx: 6.00.1x Введение в информатику и программирование с использованием Python
str
!