Risposte:
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
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.
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
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
strebyteancora figli dibasestring? Varrebbe la pena aggiungere una nota a riguardo.