Qual é a diferença entre isinstance ('aaa', basestring) e isinstance ('aaa', str)?


Respostas:


387

Nas versões Python anteriores à 3.0, existem dois tipos de strings "strings simples" e "strings unicode". Seqüências de caracteres simples ( str) não podem representar caracteres fora do alfabeto latino (ignorando os detalhes das páginas de código para simplificar). Strings Unicode ( unicode) podem representar caracteres de qualquer alfabeto, incluindo alguns fictícios como o Klingon.

Então, por que ter dois tipos de cadeias de caracteres, não seria melhor ter apenas Unicode, pois isso cobriria todos os casos? Bem, é melhor ter apenas Unicode, mas o Python foi criado antes do Unicode ser o método preferido para representar as strings. Leva tempo para fazer a transição do tipo de string em uma linguagem com muitos usuários. No Python 3.0, finalmente, todas as strings são Unicode.

A hierarquia de herança das seqüências de caracteres Python anteriores à 3.0 é:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

'basestring' introduzido no Python 2.3 pode ser considerado um passo na direção da unificação de cadeias, pois pode ser usado para verificar se um objeto é uma instância 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

13
Isso mudou no Python 3? São os novos stre byteainda filhos de basestring? Vale a pena adicionar uma observação sobre isso.
MestreLion 28/09/12

14
@MestreLion: Mudou; Py3 não possui basestringe strnem as bytesduas subclasses objectdiretamente. Mas note que isso faz sentido, pois Py2 strnão é o mesmo que Py3 bytes. basestringdeve ser pensado como "cadeia de caracteres", da qual o Py3 possui apenas o str. Portanto, a 2to3ferramenta substitui basestringpor str.
Søren Løvborg 14/03

8

Todas as cadeias são cadeias de base, mas cadeias unicode não são do tipo str. Tente isso:

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

4

Realmente o que você está perguntando é a diferença entre as classes basestring e str.

Str é uma classe que herda de basestr. Mas cadeias unicode também existem, como outras, se você quiser criar uma.

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

1

Basestring é a superclasse de string. No seu exemplo, a é do tipo "str", portanto, é uma cadeia de base e uma str

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.