[Python-Dev] Re: [Bug #121013] Bug in <stringobject>.join(<unicodestring>)
Michael Hudson
mwh21@cam.ac.uk
Tue, 28 Nov 2000 10:35:57 +0000 (GMT)
On Mon, 27 Nov 2000, Fredrik Lundh wrote:
> Michael Hudson wrote:
> > > Fredrik's PySequence_Fast_* APIs look interesting, BTW. Should be
> > > used more often :-)
> >
> > Yes. But they're pretty new, aren't they? I find them a bit
> > unsatisfactory that it's not possible to hoist the type check out of
> > the inner loop.
>
> if you can figure out a way to do that with C macros,
> I'd love to see it...
No. You can consider my above comment as a round-about way of saying "I
hate C" :-)
> on the other hand, PySequence_Fast guarantees that the
> returned object is either a list or a tuple, so you can easily
> move the test outside the loop yourself:
>
> if (PyTuple_Check(seq))
> for (...)
> item = PyTuple_GET_ITEM(seq, i)
> ...
> else
> for (...)
> item = PyList_GET_ITEM(seq, i)
> ...
But doing that would slightly eliminate the point of the PySequenceFast*
API wouldn't it? Rhetorical question; it doesn't really seem to matter.
Slightly less rhetorical question: string_join currently just assumes a
list of strings. But it is conceivable that one day it might be changed
to call __str__ on instances it finds, and then you'd have the issue of
__str__ methods changing the length of the list you're iterating over
(this might more plausibly apply in other situations where you might want
to use PySequence_Fast but I haven't gone looking for them). So would it
be feasible to change PySequence_Fast to smash the type of a list it's
given with the "immutable_list_type" from listobject.c and then have a
PySequence_Fast_End function that would decref the sequence and un-smash
the type as appropriate?
Cheers,
M.