[Web-SIG] Iterator protocols.
Alan Kennedy
py-web-sig at xhaus.com
Tue Aug 31 17:16:31 CEST 2004
Dear Phillip,
OK, now I understand what you're saying about iterators. Sorry for being
so thick, and thanks for your patience.
More below.
[Alan Kennedy]
>> I really am confused now by what you say. Is it possible that you're
>> misunderstanding my approach?
[Phillip J. Eby]
> No; your approach just isn't portable, and breaks the cross-server
> compatibility that's the point of WSGI. See below.
[Snip some java code posted by Alan]
[Phillip J. Eby]
> ...this code won't work if the application returns, say, a list. But a
> list *would* be a perfectly valid iterable in a "normal" WSGI server or
> gateway; therefore, this approach is broken.
>
> Meanwhile, an application that wants to support running in pre-2.2
> containers *other* than yours, is now forced to implement *both* the old
> and the new protocol!
>
> This is clearly broken, since there's no reason to require
> backward-compatible application code to implement a protocol that isn't
> implemented by the version of Python they're trying to support.
My misunderstanding was based on the fact that I mistakenly thought that
the application object authors would always implement the 2.2 iterator
protocol on their own objects, i.e. explicit .__iter__() and .next()
methods, etc: I forgot that they could just return a simple python
object, e.g. list, etc, which is of course an iterable as well.
[Phillip J. Eby]
> .... perhaps you should check whether there is a Java API you can
> access from Jython that's akin to PyObject_GetIter() in the C API,
> that's used in both Jython 2.1 and Jython 2.2; then your code will be
> forward and backward compatible without implementing both the old and
> the new protocols.
Unfortunately not: jython 2.1 does not have such a method in the
PyObject API. The only iterator related methods in the jython 2.1
PyObject API are
__getitem__()
__len__()
Jython 2.2alpha does have 2.2 iterator support, i.e. all built-in
sequence objects implement the 2.2 iterator protocol.
http://cvs.sourceforge.net/viewcvs.py/jython/jython/org/python/core/PyObject.java?rev=2.30&view=log
But jython 2.2 is unfortunately currently out-of-the-question: not
production quality yet. And it could be a while before it becomes
production quality. I want to create a robust jython WSGI solution for
right now.
[Phillip J. Eby]
> If there is no such API, and you want to support the 2.2 protocol,
> you'll need to hardcode both the old and new protocols, due to the fact
> that you're not coding in Python (where a simple "for" loop suffices to
> ensure portability).
I see now that that is my only option.
Which is fine, it's not actually that much work. And I would have to do
some of it for WSGI anyway, due to the requirements relating to
application objects with __len__ methods, etc.
[Alan Kennedy]
>> To me, the purpose of implementing the 2.2 iterator protocol is so
>> that applications and components run inside my framework will work, if
>> they support the 2.2 iterator protocol. I'm really not interested in
>> the pre-2.2 protocol at all, though I suppose I should be if people
>> want to run pre-2.2 iterable components in my framework.
[Phillip J. Eby]
> If a piece of code is written for 2.2 and its iterator protocol, why do
> you think it'll work in your server at all?
To me, the whole point of implementing the 2.2 iterator protocol under
jython 2.1 was so that there is at least a sporting chance that
third-party WSGI components written for cpython 2.2 will run under my
2.1 container. I only want to do what I can to make sure that jython is
not left behind .....
[Phillip J. Eby]
> It's far more likely that
> the only code you can run in your server will be code written for a 2.1
> version of Python.
I'm hoping to maximize portability, and to minimize dependencies.
[Phillip J. Eby]
> And such code, if it has an iterable at all, is
> going to be written to the old iterator protocol, because it will
> presumably want to be able to run in pre-2.2 CPython containers, too.
Well, as I mentioned above, I will attempt to explicitly support both
the old and new iterator protocols.
Do you think other folks developing embedded (i.e. not coded in python)
frameworks should consider the same?
[Phillip J. Eby]
> So, no matter what, *no* code is going to work in your server unless it
> was specifically written for your server: the exact opposite of the
> point of WSGI.
And framework-specificity is the very thing that I want to avoid most.
Kind regards,
Alan.
More information about the Web-SIG
mailing list