From 829dc3c5a64d3fa203b8cc0055e83cf23addfee3 Mon Sep 17 00:00:00 2001 From: Marc Tamlyn Date: Wed, 20 Mar 2013 10:47:56 +0000 Subject: Fixed #20094 - Be more careful when checking for Iterator Python 2.6 has some different behaviour when checking isinstance(foo, collections.Iterator). --- django/utils/itercompat.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'django/utils') diff --git a/django/utils/itercompat.py b/django/utils/itercompat.py index e7ea326536..c50dcfb779 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", DeprecationWarning, stacklevel=2) -- cgit v1.3