Яка різниця між isinstance ('aaa', basestring) і isin substance ('aaa', str)?


Відповіді:


387

У версіях 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

13
Чи змінилося це в Python 3? Це нові strта byteще діти basestring? Варто додати до цього записку.
MestreLion

14
@MestreLion: це змінилося; У Py3 немає basestringі, strі bytesобидва підкласу objectбезпосередньо. Але зауважте, що це має сенс, оскільки Py2 strне є таким, як Py3 bytes. basestringслід розглядати як "рядок символів", з яких у Py3 є тільки str. Отже, 2to3інструмент замінює basestringна str.
Søren Løvborg

8

Усі рядки є базовими рядками, але рядки Unicode не мають типу str. Спробуйте це замість цього:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False

4

Дійсно, що ви запитуєте, це різниця між базовим рядком і класом str.

Str - клас, який успадковується від basestr. Але рядки Unicode також існують, як і інші, якщо ви хочете їх створити.

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True

1

Basestring - це суперклас рядків. У вашому прикладі, a має тип "str", таким чином, він є і базовим рядком, і str

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.