diff --git a/colander/__init__.py b/colander/__init__.py index ab689c5..8e0555c 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -11,6 +11,7 @@ from .compat import ( text_type, string_types, xrange, + is_nonstr_iter, ) from . import iso8601 @@ -75,9 +76,9 @@ class Invalid(Exception): ``msg`` attribute is iterable, it is returned. If it is not iterable, a single-element list containing the ``msg`` value is returned.""" - if isinstance(self.msg, string_types): - return [self.msg] - return self.msg + if is_nonstr_iter(self.msg): + return self.msg + return [self.msg] def add(self, exc, pos=None): """ Add a child exception; ``exc`` must be an instance of diff --git a/colander/compat.py b/colander/compat.py index bb6b923..c00b0f4 100644 --- a/colander/compat.py +++ b/colander/compat.py @@ -16,6 +16,15 @@ def text_(s, encoding='latin-1', errors='strict'): return s.decode(encoding, errors) return s # pragma: no cover +if PY3: # pragma: no cover + def is_nonstr_iter(v): + if isinstance(v, str): + return False + return hasattr(v, '__iter__') +else: + def is_nonstr_iter(v): + return hasattr(v, '__iter__') + try: xrange = xrange except NameError: # pragma: no cover