2009-12-30 10 views
127
a='aaaa' 
print isinstance(a, basestring)#true 
print isinstance(a, str)#true 

Respuesta

320

En las versiones de Python anteriores a la 3.0 existen dos tipos de cadenas "strings simples" y "strings unicode". Las cadenas simples (str) no pueden representar caracteres fuera del alfabeto latino (ignorando los detalles de las páginas de códigos por simplicidad). Las cadenas Unicode (unicode) pueden representar caracteres de cualquier alfabeto, incluidos algunos de ficción como Klingon.

¿Por qué tener dos tipos de cadenas? ¿No sería mejor tener Unicode ya que eso cubriría todos los casos? Bueno, es mejor tener únicamente Unicode, pero se creó Python antes de que Unicode fuera el método preferido para representar cadenas. Lleva tiempo transitar el tipo de cadena en un idioma con muchos usuarios, en Python 3.0 finalmente sucede que todas las cadenas son Unicode.

la jerarquía de herencia de cadenas de Python pre-3,0 es:

  object 
      | 
      | 
     basestring 
      /\ 
     / \ 
     str unicode 

'basestring' introducido en Python 2.3 puede ser pensado como un paso en la dirección de la unificación de cadena, ya que se puede utilizar para comprobar si un objeto es una instancia de str o 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 
+64

+1 para el gráfico agradable ascii ;-) – ChristopheD

+7

ha hecho este cambio en Python 3? ¿Los nuevos 'str' y' byte' siguen siendo hijos de 'basetring'? Merece la pena agregar una nota sobre esto. – MestreLion

+2

+1. Una buena explicación para aquellos sin antecedentes de programación que están tratando de entender y hacer el trabajo con Python (me incluye a mí). – RubenGeert

8

Todas las cadenas son cadenas básicas, pero las cadenas unicode no son del tipo str. Pruebe esto en su lugar:

>>> a=u'aaaa' 
>>> print isinstance(a, basestring) 
True 
>>> print isinstance(a, str) 
False 
1

Basestring es la superclase de la cadena. En su ejemplo, a es de tipo "str" ​​por lo tanto, es a la vez una basetring, y un str

4

Realmente lo que está preguntando es la diferencia entre la clase base y str.

Str es una clase que hereda de basestr. Pero también existen cadenas Unicode, como otras, si quisieras crear una.

>>> a = u'aaaa' 
>>> isinstance(a, str) 
False 
>>> isinstance(a, basestring) 
True 
Cuestiones relacionadas