Как проверить тип x.startswith(), когда x имеет тип str | байты?Python

Программы на Python
Ответить
Anonymous
 Как проверить тип x.startswith(), когда x имеет тип str | байты?

Сообщение Anonymous »

У меня есть следующий код:

Код: Выделить всё

import json
from typing_extensions import Any

import lz4.block

bytebuf = bytes | bytearray
MAGIC_HEADER = b"mozLz40\0"

def jsonlz4_loads(buf: str | bytebuf) -> Any:
if isinstance(buf, bytebuf):
header: bytes = MAGIC_HEADER
else:
header: str = MAGIC_HEADER.decode("ascii")

if not buf.startswith(header):
raise ValueError("Not a valid JSONLZ4 buffer - magic bytes missing")

return json.loads(lz4.block.decompress(buf[len(header):]))
При попытке проверки типа я получаю ошибки о несовместимых типах аргументов для buf.startswith():

Код: Выделить всё

jsonlz4.py:18:27: error[invalid-argument-type] Argument to bound method `startswith` is incorrect: Expected `str | tuple[str, ...]`, found `Literal[b"mozLz40\x00"] | str`
jsonlz4.py:18:27: error[invalid-argument-type] Argument to bound method `startswith` is incorrect: Expected `Buffer | tuple[Buffer, ...]`, found `Literal[b"mozLz40\x00"] | str`
jsonlz4.py:18:27: error[invalid-argument-type] Argument to bound method `startswith` is incorrect: Expected `Buffer | tuple[Buffer, ...]`, found `Literal[b"mozLz40\x00"] | str`
Я использую astral ty в качестве средства проверки типов, но я также пробовал все другие популярные средства проверки типов (, firefly, mypy), и все они сообщают о некоторых вариантах вышеизложенного. Это меня смущает, потому что я ожидал, что isinstance(buf, bytebuf) достаточно сузит тип, но очевидно, что я здесь что-то упускаю.
Как мне добиться успешной проверки типа, не просто помечая как # тип: игнорировать?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -str-bytes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»