summaryrefslogtreecommitdiff
path: root/django/utils
diff options
context:
space:
mode:
authorMarc Tamlyn <marc.tamlyn@gmail.com>2013-03-20 10:47:56 +0000
committerClaude Paroz <claude@2xlibre.net>2013-03-22 17:45:41 +0100
commitdd897e4eeb20cab9ac708c46f34c5f09758205c8 (patch)
treee52fa69194af909b0744d97dc6eb7e6e246887e5 /django/utils
parent7206330c15b6d37dba46e311fd5135b25cf9f9e9 (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.py15
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)