İsinstance ('aaa', basestring) ve isinstance ('aaa', str) arasındaki fark nedir?


Yanıtlar:


387

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

13
Bu Python 3'te değişti mi? Yeni strve bytehala çocukları basestringmı? Bu konuda bir not eklemeye değer.
MestreLion

14
@MestreLion: Değişti; PY3 hiçbir sahiptir 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.
Søren Løvborg

8

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

4

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

1

Basestring, dizenin üst sınıfıdır. Örneğinizde, a "str" ​​türündedir, bu nedenle hem bir basestring hem de str

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.