Qual'è la differenza tra isinstance ('aaa', basestring) e isinstance ('aaa', str)?


Risposte:


387

Nelle versioni Python precedenti alla 3.0 ci sono due tipi di stringhe "stringhe semplici" e "stringhe unicode". Le stringhe semplici ( str) non possono rappresentare caratteri al di fuori dell'alfabeto latino (ignorando i dettagli delle pagine di codice per semplicità). Le stringhe Unicode ( unicode) possono rappresentare caratteri di qualsiasi alfabeto, compresi alcuni di fantasia come Klingon.

Quindi perché avere due tipi di stringhe, non sarebbe meglio avere solo Unicode poiché coprirebbe tutti i casi? Bene è meglio avere solo Unicode ma Python è stato creato prima che Unicode fosse il metodo preferito per rappresentare le stringhe. Ci vuole tempo per trasferire il tipo di stringa in una lingua con molti utenti, in Python 3.0 è finalmente possibile che tutte le stringhe siano Unicode.

La gerarchia ereditaria delle stringhe Python precedenti alla 3.0 è:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

il 'basestring' introdotto in Python 2.3 può essere considerato come un passo nella direzione dell'unificazione delle stringhe in quanto può essere usato per verificare se un oggetto è un'istanza di 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
Questo è cambiato in Python 3? I nuovi stre byteancora figli di basestring? Varrebbe la pena aggiungere una nota a riguardo.
MestreLion,

14
@MestreLion: è cambiato; PY3 non ha basestringe stred bytesentrambi sottoclasse objectdirettamente. Ma nota che questo ha senso, dal momento che Py2 strnon è lo stesso di Py3 bytes. basestringdovrebbe essere pensato come "stringa di caratteri", di cui Py3 ha solo il str. Quindi lo 2to3strumento sostituisce basestringcon str.
Søren Løvborg,

8

Tutte le stringhe sono stringhe di base, ma le stringhe unicode non sono di tipo str. Prova questo invece:

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

4

Davvero quello che stai chiedendo è la differenza tra la classe basestring e str.

Str è una classe che eredita da basestr. Ma esistono anche stringhe unicode, come potrebbero esserne altre, se volessi crearne una.

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

1

Il basestring è la superclasse di stringa. Nel tuo esempio, a è di tipo "str", quindi è sia un basestring che uno str

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.