summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-15 14:57:29 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-15 14:59:12 -0400
commit5a68f856daee59caf4c9da7d06880eada9d70302 (patch)
treebcbfdfd37acfc3ea0a8cac51f01180712cf7e2f7
parent961217aa923562c21a0113fae41d6841276e6ca5 (diff)
downloadsqlalchemy-5a68f856daee59caf4c9da7d06880eada9d70302.tar.gz
- TIL that dict.keys() in py3K is not an iterator, it is an iterable
view. So copy collections.OrderedDict and use MutableMapping to set up keys, items, values on our own OrderedDict. Conflicts: lib/sqlalchemy/engine/base.py
-rw-r--r--lib/sqlalchemy/engine/base.py4
-rw-r--r--lib/sqlalchemy/util/_collections.py46
2 files changed, 7 insertions, 43 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 3728b59fd..d2cc8890f 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -798,8 +798,8 @@ 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
- keys = list(distilled_params[0].keys())
+ # as well; but dict.keys() as an iterable is OK
+ keys = distilled_params[0].keys()
else:
keys = []
diff --git a/lib/sqlalchemy/util/_collections.py b/lib/sqlalchemy/util/_collections.py
index 5236d0120..fa27897a1 100644
--- a/lib/sqlalchemy/util/_collections.py
+++ b/lib/sqlalchemy/util/_collections.py
@@ -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: