On 4/10/2019 3:17 PM, Arup Rakshit wrote:
 From docs https://docs.python.org/3/library/itertools.html#itertools.chain I 
see that itertools.chain is defined as a function.
Because that is what the itertools functions are. (The chain entry does not use 'function', but the beginning of the doc does.) In mathematics, a 'function' is defined either as a set of input-output pairs with unique first members or as something that returns a value (output) when called with or applied to arguments (inputs). Programmers usually use 'function' in the latter sense when not using the word narrowly to refer to a specific concrete implementation of 'function'.

Calling a class returns an instance. When a class is called, it is being used as a function. CPython's exposed-by-default builtin classes are included in the 'Built-in Functions' chapter of the Library Reference. At one time, things like these were not implemented as 'classes

The Python manuals generally define the Python language, not the CPython implementation. The itertools iterator-producing functions do not have to be implemented as classes, so it would be wrong to define then as such and impose that as a requirement on all Python implementation.

But then why inspect.isclass(chain) is saying it as class.

Because, for speed, the CPython itertools module implements the itertools functions as classes written in C. In other words, this is a CPython implementation detail, not a language requirement, and one that users can and should usually ignore. One should not normally write code that depends on inspect.isclass(chain) returning True.

Another implementation could implement the itertools functions as the 'roughly equivalent' generator functions given in the manual. inspect.isclass(chain) would then be False. But if one did so, that fact that the returned iterators were specifically generators with send and throw methods would a different implementation detail that users would be expected to ignore.

I presume that Raymond originally wrote each itertool function as a generator function, to get the behavior right and write tests, and than rewrote them as C classes. One cannot write a generator function in C. I don't know if any of the functions were ever exposed publicly as generator functions, but they could have been.

--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to