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 str
ounicode
>>> 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
basestring
e str
ed bytes
entrambi sottoclasse object
direttamente. Ma nota che questo ha senso, dal momento che Py2 str
non è lo stesso di Py3 bytes
. basestring
dovrebbe essere pensato come "stringa di caratteri", di cui Py3 ha solo il str
. Quindi lo 2to3
strumento sostituisce basestring
con 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
str
ebyte
ancora figli dibasestring
? Varrebbe la pena aggiungere una nota a riguardo.