<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def extract_curves(psurf, **kwargs):
 """ Extracts curves from a surface. The return value is a ``dict`` object containing the following keys: * ``u``: the curves which generate u-direction (or which lie on the v-direction) * ``v``: the curves which generate v-direction (or which lie on the u-direction) As an example; if a curve lies on the u-direction, then its knotvector is equal to surface's knotvector on the v-direction and vice versa. The curve extraction process can be controlled via ``extract_u`` and ``extract_v`` boolean keyword arguments. :param psurf: input surface :type psurf: abstract.Surface :return: extracted curves :rtype: dict """

    if psurf.pdimension != 2:
        raise GeomdlException("The input should be a spline surface")
    if len(psurf) != 1:
        raise GeomdlException("Can only operate on single spline surfaces")

    # Get keyword arguments
    extract_u = kwargs.get('extract_u', True)
    extract_v = kwargs.get('extract_v', True)

    # Get data from the surface object
    surf_data = psurf.data
    rational = surf_data['rational']
    degree_u = surf_data['degree'][0]
    degree_v = surf_data['degree'][1]
    kv_u = surf_data['knotvector'][0]
    kv_v = surf_data['knotvector'][1]
    size_u = surf_data['size'][0]
    size_v = surf_data['size'][1]
    cpts = surf_data['control_points']

    # Determine object type
    obj = shortcuts.generate_curve(rational)

    # v-direction
    crvlist_v = []
    if extract_v:
        for u in range(size_u):
            curve = obj.__class__()
            curve.degree = degree_v
            curve.set_ctrlpts([cpts[v + (size_v * u)] for v in range(size_v)])
            curve.knotvector = kv_v
            crvlist_v.append(curve)

    # u-direction
    crvlist_u = []
    if extract_u:
        for v in range(size_v):
            curve = obj.__class__()
            curve.degree = degree_u
            curve.set_ctrlpts([cpts[v + (size_v * u)] for u in range(size_u)])
            curve.knotvector = kv_u
            crvlist_u.append(curve)

    # Return shapes as a dict object
    return dict(u=crvlist_u, v=crvlist_v)