_update(): Commented the new obscurity. Materialized into a tuple
instead of into a list for a bit of speed/space savings. Reopened the
bug report too (628246), as I'm unclear on why we don't sort out the
cause of the TypeError instead.
diff --git a/Lib/sets.py b/Lib/sets.py
index bbb93a0..5a66a2e 100644
--- a/Lib/sets.py
+++ b/Lib/sets.py
@@ -319,10 +319,16 @@
data.update(iterable)
return
- value = True
+ # If the mere process of iterating may raise TypeError, materialize
+ # the iterable into a tuple first. Then the TypeError will get
+ # raised here and propagated back to the caller. Once we get into
+ # the loop following, TypeError is assumed to mean that element
+ # can't be used as a dict key.
if type(iterable) not in (list, tuple, dict, file, xrange, str):
- iterable = list(iterable)
+ iterable = tuple(iterable)
+
it = iter(iterable)
+ value = True
while True:
try:
for element in it: