diff options
Diffstat (limited to 'lib/sqlalchemy/util/_collections.py')
-rw-r--r-- | lib/sqlalchemy/util/_collections.py | 87 |
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: |