Odpowiedzi:
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ą str
lubunicode
>>> 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
a str
i bytes
zarówno podklasę object
bezpośrednio. Ale zauważ, że ma to sens, ponieważ Py2 str
to nie to samo co Py3 bytes
. basestring
należy traktować jako „ciąg znaków”, którego Py3 ma tylko rozszerzenie str
. Stąd 2to3
narzędzie zastępuje basestring
się str
.
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
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
str
ibyte
wciąż dziecibasestring
? Warto byłoby dodać uwagę na ten temat.