<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def list_vrf(self, auth, spec=None):
 """ Return a list of VRFs matching `spec`. * `auth` [BaseAuth] AAA options. * `spec` [vrf_spec] A VRF specification. If omitted, all VRFs are returned. Returns a list of dicts. This is the documentation of the internal backend function. It's exposed over XML-RPC, please also see the XML-RPC documentation for :py:func:`nipap.xmlrpc.NipapXMLRPC.list_vrf` for full understanding. """


        if spec is None:
            spec = {}

        self._logger.debug("list_vrf called; spec: %s" % unicode(spec))

        sql = "SELECT * FROM ip_net_vrf"

        params = list()
        # no spec lists all VRFs
        if spec is not None and not {}:
            where, params = self._expand_vrf_spec(spec)
        if len(params) > 0:
            sql += " WHERE " + where

        sql += " ORDER BY vrf_rt_order(rt) NULLS FIRST"

        self._execute(sql, params)

        res = list()
        for row in self._curs_pg:
            res.append(dict(row))

        return res