[Zope3-dev] revisiting IResult (for in-Zope pipelining)
Gary Poster
gary at zope.com
Mon Apr 16 10:48:25 EDT 2007
On Apr 16, 2007, at 9:58 AM, Jim Fulton wrote:
>
> On Apr 15, 2007, at 9:51 PM, Gary Poster wrote:
[...]
>> IResult (zope/publisher/http.py, about line 600) has been the
>> hidden, private, don't-use-it-because-it's-going-away tool with
>> which you can build pipelines since before Dec. 2005
[...]
>> Can we quickly figure out a reasonable way to make the new,
>> improved interface ready for 3.4?
>
> I don't know if it is too late for 3.4.
With the schedule Christian mentioned, it seems like it would be
possible. As you point out later, it doesn't make a huge difference
to me practically because of the new egg distribution story. That
said, if it made it to 3.4 in might encourage more exploration of the
pipelining.
[...]
>> So, as a strawman, I propose that we make a public interface in
>> zope.publisher called IResult:
>>
>> class IResult(zope.interface.Interface):
>> """An iterable that provides the body data of the response.
>> For simplicity, an adapter to this interface may in fact
>> return
>> any iterable, without needing to strictly have the iterable
>> provide IResult."""
>
> (Very minot note, this violates Python docstring style. A multi-
> line docscrine should start with a single-line summary followed by
> a blank line.
Good point; thanks.
>> (I don't define __iter__ explicitly since I've been reminded too
>> many times that __getitem__ is still a workable iteration protocol.)
>
> I don't agree. Support by Python for __getitem__-based iteration
> is for backward compatibility. New code should not use __getitem__,
> but should use __iter__/next. It would be clearer IMO to include
> __iter__ in the interface.
Great by me. :-)
>> Then we look up the IResult using the same multiadaptation of
>> (result, request) we have now, which makes it possible to set
>> headers in the adapter if desired.
>>
>> An IResult adapter could then be as simple as this:
>>
>> @zope.interface.implementer(zope.publisher.interfaces.http.IResult)
>> @zope.component.adapter(
>> SomeCoolLXMLThing,
>> zope.pubisher.interfaces.browser.IBrowserRequest)
>> def postprocessLXML(lxml, request):
>> do_some_cool_transformation(lxml)
>> return output_to_html(lxml)
>
> Assuming that output_to_html returns a string, we should not
> encourage this unless we say that the publisher is going to special-
> case strings to iterate over them efficiently.
I'm tempted to do this (i.e., special-case strings). I might talk
with you about this off-line.
Thanks
Gary
More information about the Zope3-dev
mailing list