Apa perbedaan antara isinstance ('aaa', basestring) dan isinstance ('aaa', str)?


Jawaban:


387

Dalam versi Python sebelum 3.0 ada dua jenis string "string polos" dan "string unicode". String polos ( str) tidak dapat mewakili karakter di luar alfabet Latin (mengabaikan detail halaman kode untuk kesederhanaan). String Unicode ( unicode) dapat mewakili karakter dari alfabet apa pun termasuk beberapa yang fiksi seperti Klingon.

Jadi mengapa memiliki dua jenis string, bukankah lebih baik hanya memiliki Unicode karena itu akan mencakup semua kasus? Yah lebih baik hanya memiliki Unicode tetapi Python dibuat sebelum Unicode adalah metode yang disukai untuk mewakili string. Dibutuhkan waktu untuk mentransisikan tipe string dalam bahasa dengan banyak pengguna, dengan Python 3.0 akhirnya semua string adalah Unicode.

Hirarki warisan string Python pra-3.0 adalah:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

'basestring' diperkenalkan di Python 2.3 dapat dianggap sebagai langkah ke arah string unifikasi karena dapat digunakan untuk memeriksa apakah sebuah objek adalah instance dari stratauunicode

>>> 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
Apakah ini berubah dalam Python 3? Apakah anak-anak baru strdan bytemasih dari basestring? Layak menambahkan catatan tentang ini.
MestreLion

14
@EstreLion: Itu berubah; Py3 tidak memiliki basestringdan strdan byteskedua subkelas objectsecara langsung. Tetapi perhatikan bahwa ini masuk akal, karena Py2 strtidak sama dengan Py3 bytes. basestringharus dianggap sebagai "karakter string", yang hanya dimiliki oleh Py3 str. Karenanya 2to3alat ini diganti basestringdengan str.
Søren Løvborg

8

Semua string adalah basestrings, tetapi string unicode bukan tipe str. Coba ini sebagai gantinya:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False

4

Sungguh apa yang Anda tanyakan adalah perbedaan antara kelas dasar dan kelas str.

Str adalah kelas yang diwarisi dari basestr. Tetapi string unicode juga ada, seperti yang lainnya, jika Anda ingin membuatnya.

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True

1

Basestring adalah superclass dari string. Dalam contoh Anda, a adalah tipe "str" ​​dengan demikian, ia adalah basestring, dan str

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.