TGViewer
Находки в опенсорсе Находки в опенсорсе @opensource_findings · 12.6K subscribers
Post #885 8.91K
--strict-bytes в mypy@1.15

Вообще, внутри mypy есть много всякой дичи, которую нельзя выразить системой типов нормально. И потому разные хаки просто приколачивают гвоздями. Например, int и float связывают псевдо-"наследованием", чтобы штуки вроде 1 + 1.0 == 2.0 работали нормально.

Раньше так было и с bytes / bytearray / memoryview. То есть буквально можно было писать:


def func(arg: bytes) -> None:
assert isinstance(arg, bytes)

func(b'') # ok
func(bytearray(b'123')) # type checks, fails in runtime
func(memoryview(b'abc')) # type checks, fails in runtime


Даже со всеми --strict флагами. Были спрятанные --disable-bytearray-promotion и --disable-memoryview-promotion, но кто же про них знал?

PEP688

Почему было так? Потому что до PEP688 у нас не было возможности выразить C'шный тип Buffer, который появился недавно. И его выражали сначала как просто bytes (да, bytes был синонимом readonly-buffer долгое время), а потом стали выражать как:


ReadOnlyBuffer: TypeAlias = bytes
WriteableBuffer: TypeAlias = bytearray | memoryview | array.array[Any] | mmap.mmap | ctypes._CData | pickle.PickleBuffer
ReadableBuffer: TypeAlias = ReadOnlyBuffer | WriteableBuffer


Теперь все можно выразить при помощи collections.abc.Buffer.

Следовательно, нам больше не нужны type-promote для bytes / bytearray / memoryview. И флаг --strict-bytes убирает такое приведение из mypy:


# --strict-bytes
def func(arg: bytes) -> None:
assert isinstance(arg, bytes)

func(b'') # ok
func(bytearray(b'123')) # Argument 1 to "func" has incompatible type "bytearray"; expected "bytes"
func(memoryview(b'abc')) # Argument 1 to "func" has incompatible type "memoryview[int]"; expected "bytes"


Советую начинать использовать как можно раньше, потому что такое поведение будет включено в --strict с mypy@2.0, так же как и --local-partial-types. Лучше подготовиться заранее.

Два поста за два дня!

Обсуждение: как вы аннотируете объекты, которые принимают Buffer у себя в коде?

| Поддержать | YouTube | GitHub | Чат |
GitHub mypy/mypy/semanal_classprop.py at c8fad3f6a97eda2f5a0fa3a581db1194976998b8 · python/mypy Optional static typing for Python. Contribute to python/mypy development by creating an account on GitHub.
  • 👍 49
  • 🔥 11
  • ❤ 7
  • 🤔 2
More from @opensource_findings
  1. Sep 28, 2026Еще анонсы докладов на бесплатную конференцию 17 октября в НН Регистрация: https://itgorky…
  2. Sep 25, 2026Монадические выражения в Python. Наконец-то! Продолжаем разговор про интересные PEPы. Пого…
  3. Sep 15, 2026PEPы в Python окончательно вышли из-под контроля Давайте посмотрим, что происходит с ПЕПам…
  4. Sep 10, 2026Большая бесплатная конференция в Нижнем Новгороде 17 октября Регистрация: https://itgorky.…
  5. Sep 1, 2026Post #985
  6. Aug 24, 2026JIT могут удалить из CPython! PEP-836: https://peps.python.org/pep-0836 JIT в CPython имее…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →