Привет!
Меня зовут Никита Соболев. Я занимаюсь опенсорс разработкой полный рабочий день.
Тут я рассказываю про #python, #c, #opensource и тд.
Поддержать: https://boosty.to/sobolevn
РКН: https://vk.cc/cOzn36
Связь: @sobolev_nikita
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 | Чат |
- 👍 49
- 🔥 11
- ❤ 7
- 🤔 2