Antworten:
In Python-Versionen vor 3.0 gibt es zwei Arten von Zeichenfolgen: "einfache Zeichenfolgen" und "Unicode-Zeichenfolgen". Einfache Zeichenfolgen ( str
) können keine Zeichen außerhalb des lateinischen Alphabets darstellen (der Einfachheit halber werden Details von Codepages ignoriert). Unicode-Zeichenfolgen ( unicode
) können Zeichen aus jedem Alphabet darstellen, einschließlich einiger fiktiver Zeichen wie Klingonisch.
Warum also zwei Arten von Zeichenfolgen, wäre es nicht besser, nur Unicode zu haben, da dies alle Fälle abdecken würde? Nun, es ist besser, nur Unicode zu haben, aber Python wurde erstellt, bevor Unicode die bevorzugte Methode zur Darstellung von Zeichenfolgen war. Es braucht Zeit, um den Zeichenfolgentyp in eine Sprache mit vielen Benutzern zu überführen. In Python 3.0 ist es schließlich so, dass alle Zeichenfolgen Unicode sind.
Die Vererbungshierarchie von Python-Strings vor 3.0 lautet:
object
|
|
basestring
/ \
/ \
str unicode
Der in Python 2.3 eingeführte 'basestring' kann als ein Schritt in Richtung der Vereinheitlichung von Zeichenfolgen angesehen werden, da damit überprüft werden kann, ob ein Objekt eine Instanz von str
oder istunicode
>>> 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
und str
und bytes
beide Unterklassen object
direkt. Beachten Sie jedoch, dass dies sinnvoll ist, da Py2 str
nicht mit Py3 identisch ist bytes
. basestring
sollte als "Zeichenkette" betrachtet werden, von der Py3 nur die hat str
. Daher ersetzt das 2to3
Tool basestring
durch str
.
Alle Zeichenfolgen sind Basestrings, aber Unicode-Zeichenfolgen sind nicht vom Typ str. Versuchen Sie stattdessen Folgendes:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Was Sie wirklich fragen, ist der Unterschied zwischen der Basis- und der Str-Klasse.
Str ist eine Klasse, die von basestr erbt. Es gibt aber auch Unicode-Zeichenfolgen, wie auch andere, wenn Sie eine erstellen möchten.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
str
undbyte
noch Kinder vonbasestring
? Es lohnt sich, einen Hinweis dazu hinzuzufügen.