Hi,
An interesting problem was pointed out to me, which I have distilled
to this testcase:
def gen():
raise TypeError, "I am a TypeError"
yield 1
def one(): return ''.join( x for x in gen() )
def two(): return ''.join([x for x in gen()])
for x in one, two:
try:
x()
except TypeError, e:
print e
Expected output is:
"""
I am a TypeError
I am a TypeError
"""
Actual output is:
"""
sequence expected, generator found
I am a TypeError
"""
Upon looking at the implementation of 'string_join' in
stringobject.c[1], It's quite obvious what's gone wrong, an exception
has been triggered in PySequence_Fast, and string_join overrides that
exception, assuming that the only TypeErrors thrown by PySequence_Fast
are caused by 'orig' being a value that was an invalid sequence type,
ignoring the possibility that a TypeError could be thrown by
exhausting a generator.
seq = PySequence_Fast(orig, "");
if (seq == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError))
PyErr_Format(PyExc_TypeError,
"sequence expected, %.80s found",
orig->ob_type->tp_name);
return NULL;
}
I can't see an obvious solution, but perhaps generators should get
special treatment regardless. Reading over this code it looks like the
generator is exhausted all at once, instead of incrementally..
--
Stephen Thorne
Development Engineer
[1]
http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Objects/stringobject.c?rev=2.231&view=markup
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com