<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def surface_2D(num_lat=90, num_lon=180, water_depth=10., lon=None, lat=None, **kwargs):
 """Creates a 2D slab ocean Domain in latitude and longitude with uniform water depth. Domain has a single heat capacity according to the specified water depth. **Function-call argument** \n :param int num_lat: number of latitude points [default: 90] :param int num_lon: number of longitude points [default: 180] :param float water_depth: depth of the slab ocean in meters [default: 10.] :param lat: specification for latitude axis (optional) :type lat: :class:`~climlab.domain.axis.Axis` or latitude array :param lon: specification for longitude axis (optional) :type lon: :class:`~climlab.domain.axis.Axis` or longitude array :raises: :exc:`ValueError` if `lat` is given but neither Axis nor latitude array. :raises: :exc:`ValueError` if `lon` is given but neither Axis nor longitude array. :returns: surface domain :rtype: :class:`SlabOcean` :Example: :: climlab Domain object with domain_type=ocean and shape=(36, 72, 1) """

    if lat is None:
        latax = Axis(axis_type='lat', num_points=num_lat)
    elif isinstance(lat, Axis):
        latax = lat
    else:
        try:
            latax = Axis(axis_type='lat', points=lat)
        except:
            raise ValueError('lat must be Axis object or latitude array')
    if lon is None:
        lonax = Axis(axis_type='lon', num_points=num_lon)
    elif isinstance(lon, Axis):
        lonax = lon
    else:
        try:
            lonax = Axis(axis_type='lon', points=lon)
        except:
            raise ValueError('lon must be Axis object or longitude array')
    depthax = Axis(axis_type='depth', bounds=[water_depth, 0.])
    axes = {'lat': latax, 'lon': lonax, 'depth': depthax}
    slab = SlabOcean(axes=axes, **kwargs)
    return slab