def make_accessors(self, columns):
        """ Accessors can be numeric keys for sequence row data, string keys
        for mapping row data, or a callable function.  For numeric and string
        accessors they can be inside a 2 element tuple where the 2nd value is
        the default value;  Similar to dict.get(lookup, default). """
        accessors = list(self.accessors_def or range(columns))
        for i, x in enumerate(accessors):
            if not callable(x):
                if isinstance(x, collections.abc.Sequence) and \
                   not isinstance(x, str):
                    key, default = x
                else:
                    key = x
                    default = ''

                def acc(row, key=key, default=default):
                    try:
                        return row[key]
                    except (KeyError, IndexError):
                        return default
                accessors[i] = acc
        return accessors
Accessors can be numeric keys for sequence row data, string keys
        for mapping row data, or a callable function.  For numeric and string
        accessors they can be inside a 2 element tuple where the 2nd value is
        the default value;  Similar to dict.get(lookup, default).