Yanıtlar:
3.0'dan önceki Python sürümlerinde iki tür "düz dizgi" ve "unicode dizge" dizesi vardır. Düz dizeler ( str) Latin alfabesinin dışındaki karakterleri temsil edemez (basitlik için kod sayfalarının ayrıntılarını yok sayarak). Unicode dizeleri ( unicode), Klingon gibi kurgusal karakterler de dahil olmak üzere herhangi bir alfabedeki karakterleri temsil edebilir.
Öyleyse neden iki tür dizgi var, tüm vakaları kapsayacağı için Unicode'a sahip olmak daha iyi olmaz mı? Sadece Unicode'a sahip olmak daha iyidir, ancak Unicode dizeleri temsil etmek için tercih edilen yöntem olmadan önce Python oluşturuldu. Dize türünü birçok kullanıcıyla bir dilde geçirmek zaman alır, Python 3.0'da sonunda tüm dizelerin Unicode olduğu durumdur.
3.0 öncesi Python dizelerinin kalıtım hiyerarşisi:
object
|
|
basestring
/ \
/ \
str unicode
Python 2.3'te sunulan 'basestring', bir nesnenin strveyaunicode
>>> 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
basestringve strve byteshem alt sınıf objectdoğrudan. Ancak, Py2'nin Py3 strile aynı olmadığı için bunun mantıklı olduğunu unutmayın bytes. basestringPy3'te sadece "karakter dizesi" olarak düşünülmelidir str. Bu nedenle 2to3bir araç yerine basestringile str.
Tüm dizeler taban dizeleridir, ancak unicode dizeler str türünde değildir. Bunun yerine şunu deneyin:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Gerçekten sorduğunuz şey, basestring ve str sınıfı arasındaki farktır.
Str, basestr'den miras kalan bir sınıftır. Ancak unicode dizeler de, diğer dizgeler gibi, bir tane yapmak isterseniz de vardır.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
strvebytehala çocuklarıbasestringmı? Bu konuda bir not eklemeye değer.