¿Cuál es la diferencia entre isinstance ('aaa', basetring) y isinstance ('aaa', str)?


Respuestas:


387

En las versiones de Python anteriores a la 3.0 hay dos tipos de cadenas "cadenas simples" y "cadenas 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 ficticios como Klingon.

Entonces, ¿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 solo Unicode, pero Python se creó antes de que Unicode fuera el método preferido para representar cadenas. Lleva tiempo hacer la transición del tipo de cadena en un idioma con muchos usuarios, en Python 3.0 finalmente es el caso de que todas las cadenas sean Unicode.

La jerarquía de herencia de las cadenas de Python anteriores a la 3.0 es:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

La 'cadena base' introducida en Python 2.3 puede considerarse como un paso en la dirección de la unificación de cadenas, ya que puede usarse para verificar si un objeto es una instancia de strounicode

>>> 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
¿Cambió esto en Python 3? ¿Son los nuevos stry byteaún hijos de basestring? Valdría la pena agregar una nota sobre esto.
MestreLion

14
@MestreLion: cambió; AP3 no tiene basestringe stry bytestanto subclase objectdirecta. Pero tenga en cuenta que esto tiene sentido, ya que Py2 strno es lo mismo que Py3 bytes. basestringdebe considerarse como "cadena de caracteres", de la cual Py3 solo tiene el str. Por lo tanto, la 2to3herramienta se reemplaza basestringcon str.
Søren Løvborg

8

Todas las cadenas son cadenas de base, pero las cadenas unicode no son del tipo str. Intenta esto en su lugar:

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

4

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

Str es una clase que hereda de basestr. Pero también existen cadenas unicode, como podrían existir otras, si quisieras crear una.

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

1

La cadena base es la superclase de cuerdas. En su ejemplo, a es del tipo "str", por lo tanto, es tanto una cadena base como un str

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.