Відповіді:
У версіях Python до 3.0 є два типи рядків "звичайні рядки" та "рядки Unicode". Звичайні рядки ( str
) не можуть представляти символи за межами латинського алфавіту (ігноруючи деталі сторінок коду для простоти). Рядки Unicode ( unicode
) можуть представляти символи з будь-якого алфавіту, включаючи деякі вигадані, такі як Klingon.
То чому б мати два види рядків, не було б краще мати Unicode, оскільки це охоплюватиме всі випадки? Ну, краще мати тільки Unicode, але Python був створений до того, як Unicode був кращим методом представлення рядків. Щоб перейти тип рядка мовою з багатьма користувачами, потрібен час, в Python 3.0, нарешті, всі рядки Unicode.
Ієрархія спадкування рядків Python до 3.0 - це:
object
|
|
basestring
/ \
/ \
str unicode
'basestring', введений в 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
.
Усі рядки є базовими рядками, але рядки Unicode не мають типу str. Спробуйте це замість цього:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Дійсно, що ви запитуєте, це різниця між базовим рядком і класом str.
Str - клас, який успадковується від basestr. Але рядки Unicode також існують, як і інші, якщо ви хочете їх створити.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
str
таbyte
ще дітиbasestring
? Варто додати до цього записку.