0
0 комментариев

В Python2 строки обоих типов (unicode и str) были унаследованы от basestring. Это было очень удобно при проверке типов isinstance(_, basestring). В Python3 соответствующие типы строк (str и bytes) полностью независимые и не имеют общего предка (в чем тут логика?). Из-за этого приходится писать конструкции типа isinstance(_, (str, bytes)), что довольно неэстетично.

С другой стороны, существуют встроенные типы-признаки, наподобие collections.Iterable, которые позволяют через isinstance проверять принадлежность значения некоторой категории типов. Например, isinstance([], collections.Iterable) возвращает True, несмотря на то, что collections.Iterable отсутствует среди предков списка type([]).mro().

Вопрос: не существует ли подобного типа-признака для проверки всех типов строк, чтобы выполнялось условие isinstance('', StringCategoty) and isinstance(b'', StringCategoty) ?

UPD: Странно слышать, что str и bytes якобы не имеют между собой ничего общего, в то время как они реализуют почти идентичный программный интерфейс: из 44 (str) и 38 (bytes) их методов 36 — идентичны по своей функции и по форме вызова.

>>> str_methods = {method for method in dir(str) if not method.startswith('_')}
>>> bytes_methods = {method for method in dir(bytes) if not method.startswith('_')}
>>> shared_methods = str_methods.intersection(bytes_methods)
>>> len(str_methods)
44
>>> len(bytes_methods)
38
>>> len(shared_methods)
36

Вся суть различий двух типов строк сводится к тому, что один является закодированной/раскодированной формой другого. Даже их литералы записываются идентичным образом и отличаются только наличием префикса b. К тому же при работе с различными библиотеками ввода/вывода постоянно приходится иметь дело с обоими типами.


Добавить комментарий