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 str
veyaunicode
>>> 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
ve str
ve bytes
hem alt sınıf object
doğrudan. Ancak, Py2'nin Py3 str
ile aynı olmadığı için bunun mantıklı olduğunu unutmayın bytes
. basestring
Py3'te sadece "karakter dizesi" olarak düşünülmelidir str
. Bu nedenle 2to3
bir araç yerine basestring
ile 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
str
vebyte
hala çocuklarıbasestring
mı? Bu konuda bir not eklemeye değer.