ความแตกต่างระหว่าง isinstance ('aaa', basestring) และ isinstance ('aaa', str) คืออะไร?


คำตอบ:


387

ใน Python เวอร์ชันก่อนหน้า 3.0 มีสตริงสองชนิด "สตริงธรรมดา" และ "สตริง Unicode" สตริงธรรมดา ( str) ไม่สามารถแสดงอักขระนอกอักษรละติน (ละเว้นรายละเอียดของโค้ดเพจเพื่อความง่าย) สตริง Unicode ( unicode) สามารถแสดงอักขระจากตัวอักษรใด ๆ รวมถึงตัวละครบางตัวเช่น Klingon

เหตุใดจึงมีสายสองชนิดทำไมจะดีกว่าถ้ามี Unicode ไม่ได้เพราะจะครอบคลุมทุกกรณี มันจะดีกว่าถ้ามีเฉพาะ Unicode แต่ Python ถูกสร้างขึ้นก่อนที่ Unicode จะเป็นวิธีที่ต้องการใช้แทนสตริง ต้องใช้เวลาในการเปลี่ยนประเภทสตริงในภาษาที่มีผู้ใช้หลายคนใน Python 3.0 เป็นกรณีที่สตริงทั้งหมดเป็น Unicode

ลำดับชั้นการสืบทอดของสตริง Python pre-3.0 คือ:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

'basestring' นำมาใช้ใน Python 2.3 เป็นขั้นตอนในทิศทางของการรวมสตริงที่สามารถใช้เพื่อตรวจสอบว่าวัตถุเป็นอินสแตนซ์ของstrหรือunicode

>>> 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
การเปลี่ยนแปลงนี้ใน Python 3 หรือไม่? เป็นใหม่strและbyteเด็กยังคงbasestring? น่าจะเพิ่มการบันทึกเกี่ยวกับเรื่องนี้
MestreLion

14
@MestreLion: มันเปลี่ยนไป Py3 ไม่มีbasestringและstrและbytesทั้งสองประเภทรองobjectโดยตรง แต่ทราบว่านี้ทำให้รู้สึกตั้งแต่ Py2 strไม่ได้เป็นเช่นเดียวกับ bytesPy3 basestringควรจะคิดว่าเป็น "ตัวอักษร" ซึ่ง Py3 เพียง strแต่มี ดังนั้น2to3แทนที่เครื่องมือด้วยbasestring str
SørenLøvborg

8

สตริงทั้งหมดเป็น basestrings แต่สตริง Unicode ไม่ใช่ชนิด str ลองใช้สิ่งนี้แทน:

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

4

จริง ๆ สิ่งที่คุณถามคือความแตกต่างระหว่าง basestring และ str ชั้น

Str เป็นคลาสที่สืบทอดจาก basestr แต่ยังมีสตริง unicode เช่นเดียวกับสตริงอื่นถ้าคุณต้องการสร้าง

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

1

Basestring เป็นซูเปอร์คลาสของสตริง ในตัวอย่างของคุณ a คือประเภท "str" ​​ดังนั้นจึงเป็นทั้ง basestring และ str

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.