Sự khác biệt giữa isinstance ('aaa', basestring) và isinstance ('aaa', str) là gì?


Câu trả lời:


387

Trong các phiên bản Python trước 3.0, có hai loại chuỗi "chuỗi đơn giản" và "chuỗi unicode". Chuỗi đơn giản ( str) không thể biểu thị các ký tự bên ngoài bảng chữ cái Latinh (bỏ qua chi tiết của các trang mã để đơn giản). Chuỗi Unicode ( unicode) có thể biểu thị các ký tự từ bất kỳ bảng chữ cái nào, kể cả một số hư cấu như Klingon.

Vậy tại sao có hai loại chuỗi, sẽ không tốt hơn nếu chỉ có Unicode vì điều đó sẽ bao gồm tất cả các trường hợp? Tốt hơn là chỉ có Unicode nhưng Python đã được tạo trước khi Unicode là phương thức ưa thích để biểu diễn các chuỗi. Phải mất thời gian để chuyển loại chuỗi trong một ngôn ngữ có nhiều người dùng, trong Python 3.0 cuối cùng cũng có trường hợp tất cả các chuỗi là Unicode.

Hệ thống phân cấp kế thừa của chuỗi Python trước 3.0 là:

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

'Basestring' được giới thiệu trong Python 2.3 có thể được coi là một bước theo hướng hợp nhất chuỗi vì nó có thể được sử dụng để kiểm tra xem một đối tượng có phải là một thể hiện của strhay khôngunicode

>>> 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
Có phải điều này đã thay đổi trong Python 3? Là những đứa trẻ mới strbytevẫn còn của basestring? Sẽ có giá trị thêm một lưu ý về điều này.
MestreLion

14
@MestreLion: Nó đã thay đổi; Py3 không có người basestringstrbytescả lớp con objecttrực tiếp. Nhưng lưu ý rằng điều này có ý nghĩa, vì Py2 strkhông giống với Py3 bytes. basestringnên được coi là "chuỗi ký tự", trong đó Py3 chỉ có str. Do đó 2to3công cụ thay thế basestringbằng str.
Søren Løvborg

8

Tất cả các chuỗi là basestrings, nhưng chuỗi unicode không phải là kiểu str. Hãy thử điều này thay thế:

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

4

Thực sự những gì bạn đang hỏi là sự khác biệt giữa lớp cơ sở và lớp str.

Str là một lớp kế thừa từ basestr. Nhưng các chuỗi unicode cũng tồn tại, như các chuỗi khác, nếu bạn muốn tạo một chuỗi.

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

1

Basestring là siêu lớp của chuỗi. Trong ví dụ của bạn, a thuộc loại "str", do đó, nó vừa là cơ sở, vừa là str

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.