Jaka jest różnica między isinstance ('aaa', basestring) a isinstance ('aaa', str)?


Odpowiedzi:


387

W wersjach Pythona wcześniejszych niż 3.0 istnieją dwa rodzaje ciągów „zwykłe ciągi” i „ciągi znaków Unicode”. Zwykłe łańcuchy ( str) nie mogą reprezentować znaków spoza alfabetu łacińskiego (dla uproszczenia ignorujemy szczegóły stron kodowych). Ciągi Unicode ( unicode) mogą reprezentować znaki z dowolnego alfabetu, w tym niektóre fikcyjne, takie jak Klingon.

Dlaczego więc mieć dwa rodzaje ciągów, czy nie byłoby lepiej mieć po prostu Unicode, skoro obejmowałby on wszystkie przypadki? Cóż, lepiej jest mieć tylko Unicode, ale Python został stworzony, zanim Unicode był preferowaną metodą reprezentowania łańcuchów. Zmiana typu łańcucha na język, w którym jest wielu użytkowników, zajmuje trochę czasu, w Pythonie 3.0 ostatecznie jest tak, że wszystkie łańcuchy są Unicode.

Hierarchia dziedziczenia ciągów znaków Pythona w wersjach wcześniejszych niż 3.0 to:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

„basestring” wprowadzony w Pythonie 2.3 może być traktowany jako krok w kierunku unifikacji ciągów, ponieważ może być używany do sprawdzania, czy obiekt jest instancją strlubunicode

>>> 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
Czy to się zmieniło w Pythonie 3? Czy są nowe stri bytewciąż dzieci basestring? Warto byłoby dodać uwagę na ten temat.
MestreLion

14
@MestreLion: Zmieniło się; Py3 ma basestringa stri byteszarówno podklasę objectbezpośrednio. Ale zauważ, że ma to sens, ponieważ Py2 strto nie to samo co Py3 bytes. basestringnależy traktować jako „ciąg znaków”, którego Py3 ma tylko rozszerzenie str. Stąd 2to3narzędzie zastępuje basestringsię str.
Søren Løvborg

8

Wszystkie stringi są basestringami, ale stringi Unicode nie są typu str. Spróbuj tego zamiast tego:

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

4

Naprawdę pytasz o różnicę między klasą basestring i str.

Str to klasa, która dziedziczy po basestr. Ale istnieją również ciągi znaków Unicode, podobnie jak inne, jeśli chcesz je utworzyć.

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

1

Basestring to superklasa strun. W twoim przykładzie a jest typu „str”, więc jest zarówno basestringiem, jak i str

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.