Python 3.3+до 3.17collectionsпонятие
collections.abc.ByteString
collections.abc — протоколы
Устарело (deprecated, удаление в 3.17): общий тип bytes/bytearray. Используйте Buffer или конкретные типы.
Синтаксис
isinstance(obj, collections.abc.ByteString)
Ловушка прямо в имени: ByteString покрывает только bytes и bytearray, а memoryview или array под него не подпадают — как аннотация «любые байты» он всегда обманывал. С 3.12 он помечен deprecated и исчезнет в 3.17; в новом коде пишите bytes | bytearray, если нужны именно эти два типа, либо Buffer, если годится любой объект с буфером.
Примеры
import collections.abc as abc
# ByteString объявлен устаревшим в 3.12 и будет удалён в 3.17; в 3.14 он ещё есть.
print(hasattr(abc, 'ByteString')) # → True
# Замена — проверка по конкретным типам:
print(isinstance(b'x', (bytes, bytearray, memoryview))) # → True
print(isinstance(bytearray(b'x'), (bytes, bytearray, memoryview))) # → True
print(isinstance(memoryview(b'x'), (bytes, bytearray, memoryview))) # → True
print(isinstance('x', (bytes, bytearray, memoryview))) # → False
# Python 3.12+
import collections.abc as abc
# Либо abc.Buffer (появился в 3.12) — он про поддержку буферного протокола:
print(isinstance(b'x', abc.Buffer)) # → True
print(isinstance('x', abc.Buffer)) # → False
# Python 3.17+
from collections.abc import Buffer
def size(data: Buffer) -> int: # вместо ByteString в аннотации
return len(memoryview(data))
print(size(b'ab'), size(bytearray(3)), size(memoryview(b'xyz'))) # → 2 3 3
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности