<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def sun(self, date=None, local=True, use_elevation=True):
 """Returns dawn, sunrise, noon, sunset and dusk as a dictionary. :param date: The date for which to calculate the times. If no date is specified then the current date will be used. :type date: :class:`~datetime.date` :param local: True = Time to be returned in location's time zone; False = Time to be returned in UTC. If not specified then the time will be returned in local time :type local: bool :param use_elevation: True = Return times that allow for the location's elevation; False = Return times that don't use elevation. If not specified then times will take elevation into account. :type use_elevation: bool :returns: Dictionary with keys ``dawn``, ``sunrise``, ``noon``, ``sunset`` and ``dusk`` whose values are the results of the corresponding methods. :rtype: dict """


        if local and self.timezone is None:
            raise ValueError("Local time requested but Location has no timezone set.")

        if self.astral is None:
            self.astral = Astral()

        if date is None:
            date = datetime.date.today()

        elevation = self.elevation if use_elevation else 0
        sun = self.astral.sun_utc(date, self.latitude, self.longitude, observer_elevation=elevation)

        if local:
            for key, dt in sun.items():
                sun[key] = dt.astimezone(self.tz)

        return sun