]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- TIL that dict.keys() in py3K is not an iterator, it is an iterable
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 15 Aug 2014 18:57:29 +0000 (14:57 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 15 Aug 2014 18:57:29 +0000 (14:57 -0400)
view.  So copy collections.OrderedDict and use MutableMapping to set up
keys, items, values on our own OrderedDict.

lib/sqlalchemy/engine/base.py
lib/sqlalchemy/util/_collections.py

index 7b7313a2b1de793530e53da78a369e549fe8fada..cbaa4f04884ecc5573224753068728552f9236be 100644 (file)
@@ -798,7 +798,7 @@ class Connection(Connectable):
         distilled_params = _distill_params(multiparams, params)
         if distilled_params:
             # note this is usually dict but we support RowProxy
-            # as well; but dict.keys() as an iterator is OK
+            # as well; but dict.keys() as an iterable is OK
             keys = distilled_params[0].keys()
         else:
             keys = []
index 5236d0120fff74a124e1dcf23d0c6e7cf3e2137d..fa27897a11bb6eaa77944657e1df4e1594b77ac3 100644 (file)
@@ -13,6 +13,7 @@ import operator
 from .compat import threading, itertools_filterfalse
 from . import py2k
 import types
+from collections import MutableMapping
 
 EMPTY_SET = frozenset()
 
@@ -264,13 +265,11 @@ class OrderedDict(dict):
     def __iter__(self):
         return iter(self._list)
 
-    if py2k:
-        def values(self):
-            return [self[key] for key in self._list]
-
-        def keys(self):
-            return self._list
+    keys = MutableMapping.keys
+    values = MutableMapping.values
+    items = MutableMapping.items
 
+    if py2k:
         def itervalues(self):
             return iter([self[key] for key in self._list])
 
@@ -280,41 +279,6 @@ class OrderedDict(dict):
         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 __setitem__(self, key, object):
         if key not in self:
             try: