Generalize tuple() to work nicely with iterators.

NEEDS DOC CHANGES.
This one surprised me!  While I expected tuple() to be a no-brainer, turns
out it's actually dripping with consequences:
1. It will *allow* the popular PySequence_Fast() to work with any iterable
   object (code for that not yet checked in, but should be trivial).
2. It caused two std tests to fail.  This because some places used
   PyTuple_Sequence() (the C spelling of tuple()) as an indirect way to test
   whether something *is* a sequence.  But tuple() code only looked for the
   existence of sq->item to determine that, and e.g. an instance passed
   that test whether or not it supported the other operations tuple()
   needed (e.g., __len__).  So some things the tests *expected* to fail
   with an AttributeError now fail with a TypeError instead.  This looks
   like an improvement to me; e.g., test_coercion used to produce 559
   TypeErrors and 2 AttributeErrors, and now they're all TypeErrors.  The
   error details are more informative too, because the places calling this
   were *looking* for TypeErrors in order to replace the generic tuple()
   "not a sequence" msg with their own more specific text, and
   AttributeErrors snuck by that.
This commit is contained in:
Tim Peters 2001-05-05 03:56:37 +00:00
parent f4848dac41
commit 6912d4ddf0
6 changed files with 89 additions and 49 deletions

View file

@ -58,20 +58,20 @@ g(1, 2, 3, *(4, 5))
class Nothing: pass
try:
g(*Nothing())
except AttributeError, attr:
except TypeError, attr:
pass
else:
print "should raise AttributeError: __len__"
print "should raise TypeError"
class Nothing:
def __len__(self):
return 5
try:
g(*Nothing())
except AttributeError, attr:
except TypeError, attr:
pass
else:
print "should raise AttributeError: __getitem__"
print "should raise TypeError"
class Nothing:
def __len__(self):