Python 为什么functools.partial未检测为types.FunctionType?

Python 为什么functools.partial未检测为types.FunctionType?,python,functools,Python,Functools,在我的代码中,我需要检测变量是否是函数,并对其执行一些操作 一切都很顺利,直到我现在使用functools创建了一个部分函数,突然我的一些测试失败了: import types import functools def f(s): print(s) l = lambda s: print(s) pf = functools.partial(f, 'Hello World') pl = functools.partial(l, 'Hello World') test_f = isin

在我的代码中,我需要检测变量是否是函数,并对其执行一些操作

一切都很顺利,直到我现在使用
functools
创建了一个部分函数,突然我的一些测试失败了:

import types
import functools

def f(s):
    print(s)

l = lambda s: print(s)

pf = functools.partial(f, 'Hello World')
pl = functools.partial(l, 'Hello World')
test_f = isinstance(f, types.FunctionType) # True
test_l = isinstance(l, types.FunctionType) # True
test_pf = isinstance(pf, types.FunctionType) # False
test_pl = isinstance(pl, types.FunctionType) # False
为什么它们之间有区别?两个品种都可以调用。。。更重要的是,如果我不能使用
类型,我如何检测某个变量是否是函数,甚至当它是部分函数时。FunctionType

是一个带有
\u调用\u
方法的类,它在文档中说:

返回一个新的
partial
对象,该对象在调用时将表现为func

(我加上粗体强调)

我们可以在Python REPL中确认这一点:

>>> from functools import partial
>>> add_one = partial(sum, 1)
>>> type(add_one)
<class 'functools.partial'>
因此它围绕函数创建了一个简单的包装器对象,而像这样的对象根本不是函数<代码>类型。函数类型只对实际函数有效

您要寻找的是一种检查对象是否可调用的方法,因为您可以使用内置函数:

>>> callable(sum)
True
>>> callable(3)
False
>>> callable(functools.partial(sum, 1))
True
在大多数情况下,您不需要知道某个东西是否是函数。通常,您所关心的只是对象是可调用的。为了检查这一点,python有一个名为的内置函数

请注意,仅仅因为
callable
返回
True
,并不意味着调用对象会成功。然而,调用函数也可以很容易地这样说:-)


如果您确实只想处理函数和部分对象,那么您可以将支票写为:

isinstance(obj, (types.FunctionType, functools.partial))

但这还不足以满足我的口味。

为什么需要明确检查某个东西是否是函数?检查某个东西是否足够好吗?
types.FunctionType
types.LambdaType
-用户定义函数的类型以及由
lambda
表达式创建的函数。-显然不包括任何
partial
返回的内容。@mgilson有可能,如果没有其他解决方案,我并不完全反对,但我希望有is@deceze文档声称返回了一个函数:@ofersa,文档说:“返回一个新的部分对象,当调用它时,它的行为将类似于func”回答得很好,但你确定是那样的东西吗?文档声称它是一个函数:@OferSadan--不,文档声称它大致相当于列出的函数。
isinstance(obj,(types.FunctionType,functools.partial))
请不要,这只是在乞求未来的bug
isinstance(obj, (types.FunctionType, functools.partial))