web-dev-qa-db-fra.com

Quelle est la difference entre isinstance ('aaa', basestring) et isinstance ('aaa', str)?

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

Dans les versions Python antérieures à la version 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 code 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’utiliser uniquement Unicode, car cela couvrirait tous les cas? Bien, il est préférable d’avoir uniquement Unicode mais Python a été créé avant qu’Unicode ne soit la méthode privilégiée pour la représentation des chaînes. Il faut du temps pour faire la transition du type de chaîne dans une langue avec de nombreux utilisateurs, Python 3.0 c'est finalement le cas que toutes les chaînes sont Unicode.

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

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

'basestring' introduit dans Python 2.3 peut être considéré comme une étape dans la direction de l'unification des chaînes, car il peut être utilisé pour vérifier si un objet est une instance de str ou unicode

>>> 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
374
Tendayi Mawushe

Toutes les chaînes sont des chaînes de base, mais les chaînes unicode ne sont pas du type str. Essayez ceci à la place:

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

Vraiment, ce que vous demandez, c'est la différence entre les classes basestring et str.

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

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
4
McPherrinM

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

1
Alan