2023-11-04 20:37:35 -05:00
|
|
|
#!/usr/bin/python3
|
|
|
|
from builtins import bytes as bbytes
|
|
|
|
from typing import TypeVar, Type, Any
|
|
|
|
|
|
|
|
_T = TypeVar("_T")
|
|
|
|
|
|
|
|
|
|
|
|
class bytes(bbytes):
|
2023-11-07 21:22:36 -06:00
|
|
|
"""Local override of builtin bytes class to add "lazy_decode"
|
|
|
|
|
2023-11-07 21:23:59 -06:00
|
|
|
bytes(iterable_of_ints) -> bytes
|
|
|
|
bytes(string, encoding[, errors]) -> bytes
|
|
|
|
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
|
|
|
|
bytes(int) -> bytes object of size given by the parameter initialized with null bytes
|
|
|
|
bytes() -> empty bytes object
|
2023-11-07 21:22:36 -06:00
|
|
|
|
2023-11-07 21:23:59 -06:00
|
|
|
Construct an immutable array of bytes from:
|
|
|
|
- an iterable yielding integers in range(256)
|
|
|
|
- a text string encoded using the specified encoding
|
|
|
|
- any object implementing the buffer API.
|
|
|
|
- an integer
|
2023-11-07 21:22:36 -06:00
|
|
|
"""
|
2023-11-04 20:37:35 -05:00
|
|
|
|
|
|
|
def __new__(
|
|
|
|
cls: Type[_T],
|
|
|
|
thing: Any = None,
|
|
|
|
encoding: str = "UTF-8",
|
|
|
|
errors: str = "strict",
|
|
|
|
) -> _T:
|
|
|
|
if type(thing) == str:
|
2023-11-09 15:37:08 -06:00
|
|
|
cls.value = super().__new__(cls, thing, encoding, errors) # type: ignore
|
2023-11-04 20:37:35 -05:00
|
|
|
elif thing == None:
|
2023-11-09 15:37:08 -06:00
|
|
|
cls.value = super().__new__(cls) # type: ignore
|
2023-11-04 20:37:35 -05:00
|
|
|
elif thing != None:
|
2023-11-09 15:37:08 -06:00
|
|
|
cls.value = super().__new__(cls, thing) # type: ignore
|
2023-11-04 20:37:35 -05:00
|
|
|
else:
|
2023-11-08 21:20:50 -06:00
|
|
|
raise AttributeError("This shouldn't happen")
|
2023-11-09 15:37:08 -06:00
|
|
|
return cls.value # type: ignore
|
2023-11-04 20:37:35 -05:00
|
|
|
|
|
|
|
@classmethod
|
2023-11-14 16:18:41 -06:00
|
|
|
def lazy_decode(cls) -> str:
|
2023-11-14 16:09:38 -06:00
|
|
|
"Lazily decode the bytes object using string manipulation"
|
2023-11-08 21:41:07 -06:00
|
|
|
return str(cls.value)[2:-1]
|
2023-11-14 16:09:38 -06:00
|
|
|
|
|
|
|
@classmethod
|
2023-11-14 16:18:16 -06:00
|
|
|
def safe_decode(cls) -> str:
|
2023-11-14 18:03:09 -06:00
|
|
|
'Calls cls.decode(cls, errors = "ignore"), if that errors, returns a blank string'
|
2023-11-14 16:16:39 -06:00
|
|
|
try:
|
2023-11-14 16:22:46 -06:00
|
|
|
return cls.decode(cls.value, errors = "ignore") # type: ignore
|
2023-11-14 16:16:39 -06:00
|
|
|
except TypeError:
|
2023-11-14 18:37:46 -06:00
|
|
|
print("panik - invalid UTF-8")
|
2023-11-14 16:20:49 -06:00
|
|
|
return "nul"
|