Как узнать, является ли объект Python строкой?

Как проверить, является ли объект Python строкой (регулярной или Unicode)?

Ответ 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.

См. также Каков канонический способ проверки типа в python?

Ответ 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