<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def rename(self, names, inplace=False):
 """ Rename the columns using the 'names' dict. This changes the names of the columns given as the keys and replaces them with the names given as the values. If inplace == False (default) this operation does not modify the current SFrame, returning a new SFrame. If inplace == True, this operation modifies the current SFrame, returning self. Parameters names : dict[string, string] Dictionary of [old_name, new_name] inplace : bool, optional. Defaults to False. Whether the SFrame is modified in place. """

        if (type(names) is not dict):
            raise TypeError('names must be a dictionary: oldname -> newname')

        if inplace:
            self.__is_dirty__ = True
            with cython_context():
                if self._is_vertex_frame():
                    graph_proxy = self.__graph__.__proxy__.rename_vertex_fields(names.keys(), names.values())
                    self.__graph__.__proxy__ = graph_proxy
                elif self._is_edge_frame():
                    graph_proxy = self.__graph__.__proxy__.rename_edge_fields(names.keys(), names.values())
                    self.__graph__.__proxy__ = graph_proxy
            return self
        else:
            return super(GFrame, self).rename(names, inplace=inplace)