diff options
author | Jason Kirtland <jek@discorporate.us> | 2007-12-14 00:13:18 +0000 |
---|---|---|
committer | Jason Kirtland <jek@discorporate.us> | 2007-12-14 00:13:18 +0000 |
commit | 273e48c9a95825541bd461a1d5402f2e65f95876 (patch) | |
tree | f466ffbd3216e168472a72164cc4f8f5fb6dd45a /lib/sqlalchemy/util.py | |
parent | 94355aebe6758c4c393c41302adb70bfee9cec34 (diff) | |
download | sqlalchemy-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.py | 24 |
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 |