Как проверить, является ли объект Python строкой (регулярной или Unicode)?
Как узнать, является ли объект Python строкой?
Ответ 1
Python 2
Используйте isinstance(obj, basestring)
для объекта для тестирования obj
.
Docs.
Ответ 2
Чтобы проверить, является ли объект o
строковым типом подкласса строкового типа:
isinstance(o, basestring)
поскольку оба str
и unicode
являются подклассами basestring
.
Чтобы проверить, является ли тип o
ровно str
:
type(o) is str
Чтобы проверить, является ли o
экземпляром str
или любым подклассом str
:
isinstance(o, str)
Вышеупомянутые также работают для строк Unicode, если вы замените str
на unicode
.
Однако вам может не понадобиться выполнять явную проверку типов вообще. "Duck typing" может соответствовать вашим потребностям. См. http://docs.python.org/glossary.html#term-duck-typing.
Ответ 3
Python 3
В Python 3.x basestring
больше не доступно, поскольку str
является единственным строковым типом (с семантикой Python 2.x unicode
).
Итак, проверка в Python 3.x справедлива:
isinstance(obj_to_test, str)
Это означает исправление официального инструмента преобразования 2to3
: преобразование basestring
в str
.
Ответ 4
Python 2 и 3
(кросс-совместимый)
Если вы хотите проверить, не учитывая версию Python (2.x vs 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,
Ответ 5
Чтобы проверить, есть ли ваша переменная, вы можете:
s='Hello World'
if isinstance(s,str):
#do something here,
Результат isistance даст вам логическое значение True или False, чтобы вы могли соответствующим образом отрегулировать. Вы можете проверить ожидаемое сокращение вашего значения, используя сначала: тип (ы) Это вернет вам тип 'str', чтобы вы могли использовать его в функции isistance.
Ответ 6
Я нашел это больше pythonic:
if type(aObject) is str:
#do your stuff here
pass
поскольку объекты типа singleton, можно использовать для сравнения
Ответ 7
Если кто-то хочет держаться подальше от явной проверки типов (и есть веские причины держаться подальше от него), вероятно, самая безопасная часть строкового протокола для проверки:
str(maybe_string) == maybe_string
Он не будет перебирать итерируемый или итератор, он не будет вызывать строку из строки и правильно определяет stringlike в виде строки.
Конечно, есть недостатки. Например, str(maybe_string)
может быть тяжелым вычислением. Как часто, ответ зависит от этого.
Ответ 8
Я могу справиться с этим в стиле утиной печати, как говорят другие. Как я знаю, что строка - это строка? ну, очевидно, путем преобразования его в строку!
def myfunc(word):
word = unicode(word)
...
Если arg уже является строковым или unicode-типом, real_word будет хранить свое значение без изменений. Если переданный объект реализует метод __unicode__
, который используется для получения его юникодного представления. Если переданный объект не может использоваться как строка, встроенный unicode
вызывает исключение.
Ответ 9
isinstance(your_object, basestring)
будет True, если ваш объект действительно является строковым. 'str' - зарезервированное слово.
мои извинения, правильный ответ использует "basestring" вместо "str", чтобы он также включал строки Unicode - как было отмечено выше одним из других респондентов.
Ответ 10
Вы можете протестировать его, объединив пустую строку:
def is_string(s):
try:
s += ''
except:
return False
return True
Edit
Исправление моего ответа после комментариев, указывающее, что это не удается с помощью списков
def is_string(s):
return isinstance(s, basestring)
Ответ 11
В этот вечер я столкнулся с ситуацией, в которой я думал, мне нужно было проверить тип 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
Ответ 12
Для хорошего подхода к настройке утки для струнных-симпатичных, у которых есть преимущество работы с Python 2.x и 3.x:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
wisefish был близок с утиным типом, прежде чем он переключился на подход isinstance
, за исключением того, что +=
имеет другое значение для списков, чем +
делает.
Ответ 13
if type(varA) == str or type(varB) == str:
print 'string involved'
от EDX - онлайн-курс MITx: 6.00.1x Введение в компьютерную науку и программирование с использованием Python