diff options
| author | Marc Tamlyn <marc.tamlyn@gmail.com> | 2013-03-20 10:47:56 +0000 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2013-03-22 17:45:41 +0100 |
| commit | dd897e4eeb20cab9ac708c46f34c5f09758205c8 (patch) | |
| tree | e52fa69194af909b0744d97dc6eb7e6e246887e5 /django/utils | |
| parent | 7206330c15b6d37dba46e311fd5135b25cf9f9e9 (diff) | |
[1.5.x] Fixed #20094 - Be more careful when checking for Iterator
Python 2.6 has some different behaviour when checking
isinstance(foo, collections.Iterator).
Backport of 829dc3c5 from master.
Diffstat (limited to 'django/utils')
| -rw-r--r-- | django/utils/itercompat.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/django/utils/itercompat.py b/django/utils/itercompat.py index aa329c152e..2c555bd5ce 100644 --- a/django/utils/itercompat.py +++ b/django/utils/itercompat.py @@ -4,10 +4,12 @@ Where possible, we try to use the system-native version and only fall back to these implementations if necessary. """ -from django.utils.six.moves import builtins +import collections import itertools +import sys import warnings + def is_iterable(x): "A implementation independent way of checking for iterables" try: @@ -17,6 +19,17 @@ def is_iterable(x): else: return True +def is_iterator(x): + """An implementation independent way of checking for iterators + + Python 2.6 has a different implementation of collections.Iterator which + accepts anything with a `next` method. 2.7+ requires and `__iter__` method + as well. + """ + if sys.version_info >= (2, 7): + return isinstance(x, collections.Iterator) + return isinstance(x, collections.Iterator) and hasattr(x, '__iter__') + def product(*args, **kwds): warnings.warn("django.utils.itercompat.product is deprecated; use the native version instead", PendingDeprecationWarning) |
