summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util.py
diff options
context:
space:
mode:
authorJason Kirtland <jek@discorporate.us>2007-12-14 00:13:18 +0000
committerJason Kirtland <jek@discorporate.us>2007-12-14 00:13:18 +0000
commit273e48c9a95825541bd461a1d5402f2e65f95876 (patch)
treef466ffbd3216e168472a72164cc4f8f5fb6dd45a /lib/sqlalchemy/util.py
parent94355aebe6758c4c393c41302adb70bfee9cec34 (diff)
downloadsqlalchemy-273e48c9a95825541bd461a1d5402f2e65f95876.tar.gz
- Raise an error when assigning a bogusly keyed dictionary to one of the builtin dict-based collection types [ticket:886]
- Collections gain a @converter framework for flexible validation and adaptation of bulk assignment - Bogus bulk assignments now raise TypeError instead of exceptions.ArgumentError
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