В чем разница между isinstance («aaa», basestring) и isinstance («aaa», str)?

Ответы:

387

В версиях Python до 3.0 существует два вида строк: «простые строки» и «строки в кодировке Юникод». Простые строки ( str) не могут представлять символы вне латинского алфавита (для простоты игнорируем детали кодовых страниц). Строки Unicode ( unicode) могут представлять символы из любого алфавита, включая некоторые вымышленные, такие как клингон.

Так почему бы иметь два вида строк, не лучше ли было бы просто использовать Unicode, поскольку он охватывал бы все случаи? Что ж, лучше иметь только Unicode, но Python был создан до того, как Unicode был предпочтительным методом для представления строк. Требуется время, чтобы перевести строковый тип в язык со многими пользователями, в Python 3.0 это, наконец, тот случай, когда все строки являются Unicode.

Иерархия наследования строк Python до 3.0:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

«Базовая строка», представленная в Python 2.3, может рассматриваться как шаг в направлении объединения строк, поскольку ее можно использовать для проверки того, является ли объект экземпляром strилиunicode

>>> string1 = "I am a plain string"
>>> string2 = u"I am a unicode string"
>>> isinstance(string1, str)
True
>>> isinstance(string2, str)
False
>>> isinstance(string1, unicode)
False
>>> isinstance(string2, unicode)
True
>>> isinstance(string1, basestring)
True
>>> isinstance(string2, basestring)
True
Тендай Мавуше
источник
13
Изменилось ли это в Python 3? Являются ли новые strи byteеще дети basestring? Стоит добавить примечание по этому поводу.
MestreLion
14
@MestreLion: это изменилось; PY3 не имеет basestringи strи bytesоба подкласса objectнепосредственно. Но обратите внимание, что это имеет смысл, поскольку Py2 strне совпадает с Py3 bytes. basestringследует рассматривать как «строку символов», в которой Py3 имеет только str. Следовательно, 2to3инструмент заменяется basestringна str.
Сёрен Левборг
8

Все строки являются базовыми, но строки Юникода не относятся к типу str. Попробуйте это вместо этого:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Марк Байерс
источник
4

На самом деле вы спрашиваете разницу между basestring и str классом.

Str - это класс, который наследуется от basestr. Но существуют строки Unicode, как и другие, если вы хотите их создать.

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
McPherrinM
источник
1

Basestring - это суперкласс string. В вашем примере a имеет тип "str", таким образом, это и базовая строка, и str

Алан
источник