On 9/10/2015 3:23 AM, Maciej Fijalkowski wrote:
Hi

I would like to know what are the semantics if you subclass something
from itertools (e.g. islice).

I believe people are depending on an undocumented internal speed optimization. See below.

Right now it's allowed and people do it, which is why the
documentation is incorrect. It states "equivalent to: a function-or a
generator",

I believe Raymond has said that 'equivalent' should be taken as 'equivalent in essential function for iterating' rather than 'exactly equivalent for all operations'. The results of type() and isinstance() are not relevant for this. The itertools doc begins with "This module implements a number of iterator building blocks ..." After listing them, it says "The following module *functions* all construct and return iterators." (These part of the doc are unchanged from the original in 2.3. I added the emphasis.) The generator functions are mathematically equivalent if they produce equivalent iterators for the same inputs. The iterators are equivalent if they produce the same stream of objects when iterated. If they do, the doc is correct; if not, the doc is buggy and should be fixed.

I see the undocumented fact that the module *functions* are implemented as C classes as an internal implementation detail to optimize speed. I believe Raymond intentionally used 'function' rather than 'class' and intended the equivalents to be usable by other implementations. Ask Raymond directly (he is not currently active on pydev) if I am correct.

but you can't subclass whatever it is equivalent to, which
is why in PyPy we're unable to make it work in pure python.

You could write equivalent iterator classes in Python, but the result would be significantly slower.

--
Terry Jan Reedy

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to