Introducing the "for" loop
On Sun, Oct 8, 2017 at 3:58 AM, Terry Reedy <tjreedy at udel.edu> wrote:
> No built-in function is an instance of FunctionType
>>>> isinstance(compile, FunctionType)
>>>> isinstance(print, FunctionType)
> <class 'builtin_function_or_method'>
> <class 'method_descriptor'>
> FunctionType == function defined by def statement or lambda expression.
> These are a subset of functions defined by Python code.
> Unless one means 'function defined by def or class', excluding all functions
> defined in the interpreter implementation language, which can change as
> modules are recoded one way or the other, and some functions defined in
> Python, FunctionType is too narrow. The predecate would have to be at least
> BuiltinFunction = type(compile)
> MethonDescriptor = type(int.bit_length)
> isinstance(x, (FunctionType, BuiltinFunction, MethodDescriptor))
> but that still excludes bound methods and partial functions.
The three types lack a concrete base class... but fortunately, they
have an abstract one.
>>> isinstance(print, collections.abc.Callable)
>>> isinstance(int.bit_length, collections.abc.Callable)
>>> isinstance(lambda: 1, collections.abc.Callable)
>>> isinstance(range, collections.abc.Callable)
Now I know my ABCs. :)