Quelle est la différence entre isinstance ('aaa', basestring) et isinstance ('aaa', str)?

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

Réponses:

387

Dans les versions Python antérieures à la 3.0, il existe deux types de chaînes "chaînes simples" et "chaînes unicode". Les chaînes simples ( str) ne peuvent pas représenter des caractères en dehors de l'alphabet latin (en ignorant les détails des pages de codes pour plus de simplicité). Les chaînes Unicode ( unicode) peuvent représenter des caractères de n'importe quel alphabet, y compris des caractères fictifs comme Klingon.

Alors pourquoi avoir deux types de chaînes, ne serait-il pas préférable d'avoir uniquement Unicode puisque cela couvrirait tous les cas? Eh bien, il est préférable d'avoir uniquement Unicode, mais Python a été créé avant Unicode était la méthode préférée pour représenter les chaînes. La transition du type chaîne dans un langage avec de nombreux utilisateurs prend du temps, en Python 3.0 c'est finalement le cas que toutes les chaînes sont Unicode.

La hiérarchie d'héritage des chaînes Python antérieures à 3.0 est:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

'basestring' introduit dans Python 2.3 peut être considéré comme une étape dans le sens de l'unification des chaînes car il peut être utilisé pour vérifier si un objet est une instance de strouunicode

>>> 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
la source
13
Cela a-t-il changé dans Python 3? Les nouveaux stret bytetoujours enfants de basestring? Cela vaudrait la peine d'ajouter une note à ce sujet.
MestreLion
14
@MestreLion: Cela a changé; Py3 n'a pas de sous-classe basestringet stret les bytesdeux objectdirectement. Mais notez que cela a du sens, puisque Py2 strn'est pas le même que Py3 bytes. basestringdoit être considéré comme une "chaîne de caractères", dont Py3 n'a que l'extension str. Par conséquent, l' 2to3outil remplace basestringpar str.
Søren Løvborg
8

Toutes les chaînes sont des chaînes de base, mais les chaînes Unicode ne sont pas de type str. Essayez plutôt ceci:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Mark Byers
la source
4

Ce que vous demandez vraiment, c'est la différence entre la classe basestring et str.

Str est une classe qui hérite de basestr. Mais les chaînes Unicode existent également, comme d'autres, si vous vouliez en créer une.

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
McPherrinM
la source
1

Basestring est la superclasse de la chaîne. Dans votre exemple, a est de type "str" ​​donc, c'est à la fois une chaîne de base et un str

Alan
la source