You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
builtin_function_or_method is also either a function or a method #91370
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=Nonecreated_at=<Date2022-04-04.11:51:09.624>labels= ['build', '3.11']
title='builtin_function_or_method is also either a function or a method'updated_at=<Date2022-04-04.17:51:35.304>user='https://github.com/ravi140222'
in the background even the builtin abs is a function, so shouldn't it return True?
the way this check is implemented is by matching the type of a builtin_function_or_method with,
type(len)
and since, type(len) is builtin_function_or_method, so, the inspect.isfunction check gives False.
But in my opinion, it should return True, even for builtin functions or methods.
"""
inspect.isfunction(object)
Return True if the object is a Python function, which includes functions created by a lambda expression.
"""
Emphasis on the "Python function", as in, something written in Python using a def statement or a lambda expression. If isfunction returns True, you can presumably access function-specific implementation details like the functions's f.code attribute. If you need to check for "anything that works as a function", you can use callable():
I agree with Dennis that the isfunction test is for **Python** (def or lambda) functions, not builtins. The docstring for the inspect.is* methods make promises about what attributes an object will have:
defisbuiltin(object):
"""Return true if the object is a built-in function or method. Built-in functions and methods provide these attributes: __doc__ documentation string __name__ original name of this function or method __self__ instance to which a method is bound, or None"""defisfunction(object):
"""Return true if the object is a user-defined function. Function objects provide these attributes: __doc__ documentation string __name__ name with which this function was defined __code__ code object containing compiled function bytecode __defaults__ tuple of any default values for arguments __globals__ global namespace in which this function was defined __annotations__ dict of parameter annotations __kwdefaults__ dict of keyword only parameters with defaults"""
def (and lambda) functions have a different API from builtin_function_or_method objects. They should be kept separate.
ravi140222 commented on Apr 4, 2022
ravi140222mannequin
MannequinAuthor
More actions
yes, I think inspect.isroutine does the required functionality.
sorry, I did not know about it, and could not think of the word routine when checking for functions.
Activity
ravi140222 commentedon Apr 4, 2022
the.
does not consider a
as a function.
for example,
gives,
in the background even the builtin
absis a function, so shouldn't it return True?the way this check is implemented is by matching the type of a builtin_function_or_method with,
and since,
type(len)isbuiltin_function_or_method, so, theinspect.isfunctioncheck gives False.But in my opinion, it should return True, even for builtin functions or methods.
sweeneyde commentedon Apr 4, 2022
https://docs.python.org/3/library/inspect.html#inspect.isfunction says this:
"""
inspect.isfunction(object)
Return True if the object is a Python function, which includes functions created by a lambda expression.
"""
Emphasis on the "Python function", as in, something written in Python using a
defstatement or alambdaexpression. If isfunction returns True, you can presumably access function-specific implementation details like the functions's f.code attribute. If you need to check for "anything that works as a function", you can usecallable():I'm not an expert on the inspect module, but I'm guessing it's not worth breaking backwards-compatibility to change this behavior.
Would extra emphasis in the documentation have been helpful for you, or were you mostly attempting to rely on the function's name?
ravi140222 commentedon Apr 4, 2022
but
callablereturnsTruefor classes with__call__also, it does not check whether the argument passed to it is a function or not.I want some way to return
Truefor both builtin functions and Python functions, but not for classes.And similarly, some way to return
Truefor both builtin methods and Python methods.Should the documentation for
inspect.isfunctioninclude,this does not include builtin functions., and similarly forinspect.ismethod?Should I create a PR to add these two sentences to the documentation?
stevendaprano commentedon Apr 4, 2022
Perhaps what you want is inspect.isroutine ?
https://docs.python.org/3/library/inspect.html#inspect.isroutine
I agree with Dennis that the isfunction test is for **Python** (def or lambda) functions, not builtins. The docstring for the inspect.is* methods make promises about what attributes an object will have:
def (and lambda) functions have a different API from builtin_function_or_method objects. They should be kept separate.
ravi140222 commentedon Apr 4, 2022
yes, I think
inspect.isroutinedoes the required functionality.sorry, I did not know about it, and could not think of the word
routinewhen checking for functions.carlbordum commentedon May 10, 2022
I believe this issue can be closed.