Was ist der Unterschied zwischen isinstance ('aaa', basestring) und isinstance ('aaa', str)?


Antworten:


387

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 stroder 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

13
Hat sich dies in Python 3 geändert? Sind die neuen strund bytenoch Kinder von basestring? Es lohnt sich, einen Hinweis dazu hinzuzufügen.
MestreLion

14
@MestreLion: Es hat sich geändert; Py3 hat keine basestringund strund bytesbeide Unterklassen objectdirekt. Beachten Sie jedoch, dass dies sinnvoll ist, da Py2 strnicht mit Py3 identisch ist bytes. basestringsollte als "Zeichenkette" betrachtet werden, von der Py3 nur die hat str. Daher ersetzt das 2to3Tool basestringdurch str.
Søren Løvborg

8

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

4

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

1

Basestring ist die Oberklasse der Saiten. In Ihrem Beispiel ist a vom Typ "str", es ist also sowohl ein Basisring als auch ein str

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.