Відповіді:
У версіях 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? Варто додати до цього записку.