Python Glossary English

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Сообщить о неточности