def METHOD_NAME(self, family: int, daddr: Tuple[int, int]) -> str:
    """
    _ip_addr_to_str returns a string representation of an IPv4 or IPv6
    address. It caches results in an LRU cache to reduce cost of conversion
    Args:
        family: socket.AF_INET (v4) or socket.AF_INET6 (v6)
        daddr: For IPv4, uint32 representation of address as the first item
        in a tuple. For IPv6, 16-byte array representation of address.
    Returns:
        String representation of IP address, e.g., '127.0.0.1'
    """
    if family == AF_INET:
        return inet_ntop(AF_INET, pack('I', daddr[0]))
    elif family == AF_INET6:
        # noinspection PyTypeChecker
        return inet_ntop(AF_INET6, self.Addr(*daddr))
    else:
        raise Exception("No valid socket family given!")