summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/associationproxy.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-09-14 11:31:33 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2011-09-14 11:31:33 -0400
commit1cf80dc5b273dc92607863bdd3af859840aa3364 (patch)
tree7529a14e1fae87a3d024fddd667efe4c757576de /lib/sqlalchemy/ext/associationproxy.py
parent98a08bf207c21a4bc06c2ec6fbda9819f59dc751 (diff)
downloadsqlalchemy-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.py17
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