[Zope3-dev] revisiting IResult (for in-Zope pipelining)

Jim Fulton jim at zope.com
Mon Apr 16 09:58:11 EDT 2007


On Apr 15, 2007, at 9:51 PM, Gary Poster wrote:

> The work that Jim Washington and David Pratt have started recently  
> to make lxml an XHTML generator/ZPT replacement [#1]_ has really  
> excited me.  It would be *great* with in-Zope pipelines [#2]_.
>
> 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 [#3]_  I know  
> at least a couple of people who haven't explored the idea of using  
> it for a pipeline, despite interest, simply because the IResult  
> interface was private.
>
> 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 it there, competitively or collaboratively, we can write in- 
> Zope pipelines as standalone packages, and "may the best pipeline  
> win".  Or we can just get a start with some small, cool lxml stuff.
>
> So what should the public API be?
>
> Here are two emails Jim (Fulton) wrote, corresponding with  
> Phillipp, about the thoughts behind IResult.
>
> http://mail.zope.org/pipermail/zope3-dev/2005-December/016778.html
> http://mail.zope.org/pipermail/zope3-dev/2005-December/016796.html
>
> Talking with Jim about this recently, he effectively questioned  
> this bullet point from the first email I linked:
>
> """
> - An adapter may need to affect outut headers, so IResult
>    needed to provide header data.
> """
>
> His question was, since the adaptation gets the request, why not  
> just have the adapter set the headers directly with request.response?
>
> That line of reasoning appeals to me.

Yup. Thanks for gathering all of this historical information  
together.  I think my original qualms about IResult had to do with  
the controversy surrounding it at the time.

>
> 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.

> (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.


> 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.


> and it might do a bit of request.response.setHeader(...) calls too,  
> if appropriate.

Yup.

> We would delete the private IResult entirely, without deprecation  
> (I argue that the warning in the doc string is pretty supportive of  
> this).

Yup.

...

> Votes?

Aside from 3.4 timing, +1.  I don't know if this can be done for 3.4.

Maybe this should be done in a post-3.4 zope.publisher release.

Thanks again for championing this.

Jim

--
Jim Fulton			mailto:jim at zope.com		Python Powered!
CTO 				(540) 361-1714			http://www.python.org
Zope Corporation	http://www.zope.com		http://www.zope.org





More information about the Zope3-dev mailing list