summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util/_collections.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/util/_collections.py')
-rw-r--r--lib/sqlalchemy/util/_collections.py87
1 files changed, 60 insertions, 27 deletions
diff --git a/lib/sqlalchemy/util/_collections.py b/lib/sqlalchemy/util/_collections.py
index 8e61275e7..86a90828a 100644
--- a/lib/sqlalchemy/util/_collections.py
+++ b/lib/sqlalchemy/util/_collections.py
@@ -9,7 +9,8 @@
import itertools
import weakref
import operator
-from .compat import threading
+from .compat import threading, itertools_filterfalse
+from . import py2k
EMPTY_SET = frozenset()
@@ -142,7 +143,7 @@ class Properties(object):
return len(self._data)
def __iter__(self):
- return self._data.itervalues()
+ return iter(list(self._data.values()))
def __add__(self, other):
return list(self) + list(other)
@@ -189,13 +190,13 @@ class Properties(object):
return default
def keys(self):
- return self._data.keys()
+ return list(self._data)
def values(self):
- return self._data.values()
+ return list(self._data.values())
def items(self):
- return self._data.items()
+ return list(self._data.items())
def has_key(self, key):
return key in self._data
@@ -260,23 +261,55 @@ class OrderedDict(dict):
def __iter__(self):
return iter(self._list)
- def values(self):
- return [self[key] for key in self._list]
- def itervalues(self):
- return iter([self[key] for key in self._list])
+ if py2k:
+ def values(self):
+ return [self[key] for key in self._list]
- def keys(self):
- return list(self._list)
+ def keys(self):
+ return self._list
- def iterkeys(self):
- return iter(self.keys())
+ def itervalues(self):
+ return iter([self[key] for key in self._list])
- def items(self):
- return [(key, self[key]) for key in self.keys()]
+ def iterkeys(self):
+ return iter(self)
+
+ def iteritems(self):
+ return iter(self.items())
+
+ def items(self):
+ return [(key, self[key]) for key in self._list]
+ else:
+ def values(self):
+ #return (self[key] for key in self)
+ return (self[key] for key in self._list)
+
+ def keys(self):
+ #return iter(self)
+ return iter(self._list)
+
+ def items(self):
+ #return ((key, self[key]) for key in self)
+ return ((key, self[key]) for key in self._list)
+
+ _debug_iter = False
+ if _debug_iter:
+ # normally disabled to reduce function call
+ # overhead
+ def __iter__(self):
+ len_ = len(self._list)
+ for item in self._list:
+ yield item
+ assert len_ == len(self._list), \
+ "Dictionary changed size during iteration"
+ def values(self):
+ return (self[key] for key in self)
+ def keys(self):
+ return iter(self)
+ def items(self):
+ return ((key, self[key]) for key in self)
- def iteritems(self):
- return iter(self.items())
def __setitem__(self, key, object):
if key not in self:
@@ -470,8 +503,8 @@ class IdentitySet(object):
if len(self) > len(other):
return False
- for m in itertools.ifilterfalse(other._members.__contains__,
- self._members.iterkeys()):
+ for m in itertools_filterfalse(other._members.__contains__,
+ iter(self._members.keys())):
return False
return True
@@ -491,8 +524,8 @@ class IdentitySet(object):
if len(self) < len(other):
return False
- for m in itertools.ifilterfalse(self._members.__contains__,
- other._members.iterkeys()):
+ for m in itertools_filterfalse(self._members.__contains__,
+ iter(other._members.keys())):
return False
return True
@@ -582,7 +615,7 @@ class IdentitySet(object):
return result
def _member_id_tuples(self):
- return ((id(v), v) for v in self._members.itervalues())
+ return ((id(v), v) for v in self._members.values())
def __xor__(self, other):
if not isinstance(other, IdentitySet):
@@ -599,7 +632,7 @@ class IdentitySet(object):
return self
def copy(self):
- return type(self)(self._members.itervalues())
+ return type(self)(iter(self._members.values()))
__copy__ = copy
@@ -607,13 +640,13 @@ class IdentitySet(object):
return len(self._members)
def __iter__(self):
- return self._members.itervalues()
+ return iter(self._members.values())
def __hash__(self):
raise TypeError('set objects are unhashable')
def __repr__(self):
- return '%s(%r)' % (type(self).__name__, self._members.values())
+ return '%s(%r)' % (type(self).__name__, list(self._members.values()))
class WeakSequence(object):
@@ -623,7 +656,7 @@ class WeakSequence(object):
)
def __iter__(self):
- return self._storage.itervalues()
+ return iter(self._storage.values())
def __getitem__(self, index):
try:
@@ -754,7 +787,7 @@ def flatten_iterator(x):
"""
for elem in x:
- if not isinstance(elem, basestring) and hasattr(elem, '__iter__'):
+ if not isinstance(elem, str) and hasattr(elem, '__iter__'):
for y in flatten_iterator(elem):
yield y
else: