Movatterモバイル変換


[0]ホーム

URL:


[Python-Dev] string_join overrides TypeError exception thrown ingenerator

Stephen Thornestephen.thorne at gmail.com
Mon Aug 15 08:40:22 CEST 2005


Hi,An interesting problem was pointed out to me, which I have distilledto this testcase:def gen():     raise TypeError, "I am a TypeError"     yield 1def 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 eExpected output is:"""I am a TypeErrorI am a TypeError"""Actual output is:"""sequence expected, generator foundI am a TypeError"""Upon looking at the implementation of 'string_join' instringobject.c[1], It's quite obvious what's gone wrong, an exceptionhas been triggered in PySequence_Fast, and string_join overrides thatexception, assuming that the only TypeErrors thrown by PySequence_Fastare caused by 'orig' being a value that was an invalid sequence type,ignoring the possibility that a TypeError could be thrown byexhausting 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 getspecial treatment regardless. Reading over this code it looks like thegenerator is exhausted all at once, instead of incrementally..-- Stephen ThorneDevelopment Engineer[1]http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Objects/stringobject.c?rev=2.231&view=markup


More information about the Python-Devmailing list

[8]ページ先頭

©2009-2025 Movatter.jp