Calls `postcodes.get_from_geo` but checks the correctness of 
        all arguments, and by default utilises a local cache.

        :param skip_cache: optional argument specifying whether to skip 
                           the cache and make an explicit request.

        :raises IllegalPointException: if the latitude or longitude 
                                       are out of bounds.

        :returns: a list of dicts containing postcode data within the 
                  specified distance.

def get_from_geo(self, lat, lng, distance, skip_cache=False):
        """
        Calls `postcodes.get_from_geo` but checks the correctness of 
        all arguments, and by default utilises a local cache.

        :param skip_cache: optional argument specifying whether to skip 
                           the cache and make an explicit request.

        :raises IllegalPointException: if the latitude or longitude 
                                       are out of bounds.

        :returns: a list of dicts containing postcode data within the 
                  specified distance.
        """
        # remove spaces and change case here due to caching
        lat, lng, distance = float(lat), float(lng), float(distance)
        if distance < 0:
            raise IllegalDistanceException("Distance must not be negative")
        self._check_point(lat, lng)
        return self._lookup(skip_cache, get_from_geo, lat, lng, distance)