a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true
В версиях Python до 3.0 есть два вида строк "простые строки" и "строки в уникоде". Обычные строки (str
) не могут представлять символы вне латинского алфавита (для простоты игнорируя детали кодовых страниц). Юникод-строки (unicode
) могут представлять символы любого алфавита, включая некоторые вымышленные, например, клингонский.
Так зачем иметь два типа строк, не лучше ли просто иметь Юникод, так как он охватывает все случаи? Ну, лучше иметь только Юникод, но Python был создан до того, как Юникод стал предпочтительным методом представления строк. Нужно время, чтобы перевести строковый тип на язык с большим количеством пользователей, на Python 3.0 наконец-то все строки созданы с использованием Юникода.
Иерархия наследования строк на Python до 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
На самом деле вы спрашиваете о различии между базовыми строками и классом str.
Str - это класс, который наследуется от базовой строки. Но существуют и строки юникода, как и другие, если вы хотите их сделать.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
Basestring - это суперкласс строк. В вашем примере строка имеет тип "str", таким образом, она является и basetring, и str
.Все строки являются строками базовой строки, но строки юникода не являются строками типа. Попробуйте вместо этого:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False