summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/util.py')
-rw-r--r--lib/sqlalchemy/util.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py
index 1fee4cef0..705168d20 100644
--- a/lib/sqlalchemy/util.py
+++ b/lib/sqlalchemy/util.py
@@ -193,6 +193,30 @@ def duck_type_collection(specimen, default=None):
else:
return default
+def dictlike_iteritems(dictlike):
+ """Return a (key, value) iterator for almost any dict-like object."""
+
+ if hasattr(dictlike, 'iteritems'):
+ return dictlike.iteritems()
+ elif hasattr(dictlike, 'items'):
+ return iter(dictlike.items())
+
+ getter = getattr(dictlike, '__getitem__', getattr(dictlike, 'get', None))
+ if getter is None:
+ raise TypeError(
+ "Object '%r' is not dict-like" % dictlike)
+
+ if hasattr(dictlike, 'iterkeys'):
+ def iterator():
+ for key in dictlike.iterkeys():
+ yield key, getter(key)
+ return iterator()
+ elif hasattr(dictlike, 'keys'):
+ return iter([(key, getter(key)) for key in dictlike.keys()])
+ else:
+ raise TypeError(
+ "Object '%r' is not dict-like" % dictlike)
+
def assert_arg_type(arg, argtype, name):
if isinstance(arg, argtype):
return arg