diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-09-14 11:31:33 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-09-14 11:31:33 -0400 |
commit | 1cf80dc5b273dc92607863bdd3af859840aa3364 (patch) | |
tree | 7529a14e1fae87a3d024fddd667efe4c757576de /lib/sqlalchemy/ext/associationproxy.py | |
parent | 98a08bf207c21a4bc06c2ec6fbda9819f59dc751 (diff) | |
download | sqlalchemy-1cf80dc5b273dc92607863bdd3af859840aa3364.tar.gz |
- Changed the update() method on association proxy
dictionary to use a duck typing approach, i.e.
checks for "keys", to discern between update({})
and update((a, b)). Previously, passing a
dictionary that had tuples as keys would be misinterpreted
as a sequence. [ticket:2275]
Diffstat (limited to 'lib/sqlalchemy/ext/associationproxy.py')
-rw-r--r-- | lib/sqlalchemy/ext/associationproxy.py | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/sqlalchemy/ext/associationproxy.py b/lib/sqlalchemy/ext/associationproxy.py index 47b21ab5b..eb5b3e3db 100644 --- a/lib/sqlalchemy/ext/associationproxy.py +++ b/lib/sqlalchemy/ext/associationproxy.py @@ -768,11 +768,20 @@ class _AssociationDict(_AssociationCollection): len(a)) elif len(a) == 1: seq_or_map = a[0] - for item in seq_or_map: - if isinstance(item, tuple): - self[item[0]] = item[1] - else: + # discern dict from sequence - took the advice + # from http://www.voidspace.org.uk/python/articles/duck_typing.shtml + # still not perfect :( + if hasattr(seq_or_map, 'keys'): + for item in seq_or_map: self[item] = seq_or_map[item] + else: + try: + for k, v in seq_or_map: + self[k] = v + except ValueError: + raise ValueError( + "dictionary update sequence " + "requires 2-element tuples") for key, value in kw: self[key] = value |