'Determines if the signature has any errors.
:returns: whether or not there are non-ignored errors
:rtype: bool'

def has_errors(self):

    if self.ignored_errors:
        igcodes = {err.code for err in tup(self.ignored_errors)}
        error_codes = {code for (code, _) in self.errors}
        return (not error_codes.issubset(igcodes))
    else:
        return bool(self.errors)
