Ответы:
В версиях 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
basestring
и str
и bytes
оба подкласса object
непосредственно. Но обратите внимание, что это имеет смысл, поскольку Py2 str
не совпадает с Py3 bytes
. basestring
следует рассматривать как «строку символов», в которой Py3 имеет только str
. Следовательно, 2to3
инструмент заменяется basestring
на str
.
Все строки являются базовыми, но строки Юникода не относятся к типу str. Попробуйте это вместо этого:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
На самом деле вы спрашиваете разницу между basestring и str классом.
Str - это класс, который наследуется от basestr. Но существуют строки Unicode, как и другие, если вы хотите их создать.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
str
иbyte
еще детиbasestring
? Стоит добавить примечание по этому поводу.