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

159
a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true
zjm1126
quelle

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
Tendayi Mawushe
quelle
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
Mark Byers
quelle
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
McPherrinM
quelle
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

Alan
quelle