Как узнать, является ли объект Python строкой? - PullRequest
353 голосов
/ 20 августа 2009

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

Ответы [ 13 ]

292 голосов
/ 20 августа 2009

Python 2

Используйте isinstance(obj, basestring) для объекта тестирования obj.

Docs .

155 голосов
/ 20 августа 2009

Чтобы проверить, является ли объект 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?

130 голосов
/ 23 октября 2014

Python 3

В Python 3.x basestring больше не доступен, так как str - это единственный тип строки (с семантикой Python 2.x's unicode).

Итак, проверка в Python 3.x просто:

isinstance(obj_to_test, str)

Это следует за исправлением официального 2to3 инструмента преобразования: преобразование basestring в str.

85 голосов
/ 16 мая 2014

Python 2 и 3

(кросс-совместимый)

Если вы хотите проверить без учета версии Python (2.x против 3.x), используйте six ( PyPI ) и его атрибут string_types:

import six

if isinstance(obj, six.string_types):
    print('obj is a string!')

Внутри six (очень легкий однофайловый модуль) он просто делает this :

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str
else:
    string_types = basestring
13 голосов
/ 14 июня 2016

Я нашел это и еще pythonic:

if type(aObject) is str:
    #do your stuff here
    pass

, поскольку объекты типа являются одноэлементными, is может использоваться для сравнения объекта с типом str

11 голосов
/ 28 июля 2016

Если кто-то хочет держаться подальше от явной проверки типов (а есть веские причины держаться от нее подальше), возможно, самая безопасная часть строкового протокола для проверки:

str(maybe_string) == maybe_string

Он не будет проходить через итерацию или итератор, он не будет вызывать список строк как строку, и он правильно обнаружит stringlike как строку.

Конечно, есть и недостатки. Например, str(maybe_string) может быть тяжелым вычислением. Как часто, ответ: , это зависит .

11 голосов
/ 30 июня 2016

Чтобы проверить, является ли ваша переменная чем-то вроде:

s='Hello World'
if isinstance(s,str):
#do something here,

Выходное значение isistance даст вам логическое значение True или False, чтобы вы могли соответствующим образом настроить. Вы можете проверить ожидаемую аббревиатуру вашего значения, первоначально используя: тип (ы) Это вернет вам тип 'str', чтобы вы могли использовать его в функции isistance.

5 голосов
/ 21 августа 2009

Я мог бы иметь дело с этим в стиле печати утки, как другие упоминают. Как я узнаю, что строка действительно является строкой? ну, очевидно, путем преобразования в строку!

def myfunc(word):
    word = unicode(word)
    ...

Если arg уже является строковым или юникодным типом, real_word будет хранить его значение без изменений. Если переданный объект реализует метод __unicode__, он используется для получения его представления в юникоде. Если переданный объект нельзя использовать как строку, встроенная функция unicode вызывает исключение.

3 голосов
/ 19 марта 2014
isinstance(your_object, basestring)

будет True, если ваш объект действительно является строковым типом. 'str' - зарезервированное слово.

мои извинения, правильный ответ - использовать 'basestring' вместо 'str' для того, чтобы он также включал строки Unicode - как было отмечено выше одним из других респондентов.

1 голос
/ 21 июля 2017

Этим вечером я столкнулся с ситуацией, в которой я подумал , что мне нужно будет проверить тип 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
...