Source code for hexbytes.main

from typing import (
    TYPE_CHECKING,
    Callable,
    Tuple,
    Type,
    Union,
    cast,
    overload,
)

from ._utils import (
    to_bytes,
)

if TYPE_CHECKING:
    from typing import (
        SupportsIndex,
    )

BytesLike = Union[bool, bytearray, bytes, int, str, memoryview]


[docs] class HexBytes(bytes): """ Thin wrapper around the python built-in :class:`bytes` class. It has these changes: 1. Accepts more initializing values: bool, bytearray, bytes, (non-negative) int, str, and memoryview 2. The representation at console (__repr__) is 0x-prefixed 3. ``to_0x_hex`` returns a 0x-prefixed hex string """ def __new__(cls: Type[bytes], val: BytesLike) -> "HexBytes": bytesval = to_bytes(val) return cast(HexBytes, super().__new__(cls, bytesval)) # type: ignore # https://github.com/python/typeshed/issues/2630 # noqa: E501 @overload def __getitem__(self, key: "SupportsIndex") -> int: # noqa: F811 ... @overload # noqa: F811 def __getitem__(self, key: slice) -> "HexBytes": # noqa: F811 ... def __getitem__( # noqa: F811 self, key: Union["SupportsIndex", slice] ) -> Union[int, bytes, "HexBytes"]: result = super().__getitem__(key) if hasattr(result, "hex"): return type(self)(result) else: return result def __repr__(self) -> str: return f"HexBytes({'0x' + self.hex()!r})"
[docs] def to_0x_hex(self) -> str: """ Convert the bytes to a 0x-prefixed hex string """ return "0x" + self.hex()
def __reduce__( self, ) -> Tuple[Callable[..., bytes], Tuple[Type["HexBytes"], bytes]]: """ An optimized ``__reduce__`` that bypasses the input validation in ``HexBytes.__new__`` since an existing HexBytes instance has already been validated when created. """ return bytes.__new__, (type(self), bytes(self))