检查包装的Python函数是否像函数一样可调用

时间:2019-09-01 22:17:08

标签: python dask

这是一个Python函数

def inc(x):
    return x + 1

x = 1

isinstance函数如果object参数是classinfo参数或其(直接,间接或虚拟)子类的实例,则返回true。

>>> isinstance(inc, types.FunctionType)
True

尽管在检查包装器中的函数时isinstance不起作用。

>>> from dask import delayed

>>> isinstance(delayed(inc), types.FunctionType)
False
>>> isinstance(delayed(inc)(x), types.FunctionType)
True

问题

有没有办法检查包装器中的Python函数?

1 个答案:

答案 0 :(得分:1)

许多(但不是全部)装饰器返回一个FunctionType。在@delayed装饰器中包装函数时,它不会返回函数; returns a class instance (object) of Delayed

因此,您可能希望在这里callable(),而不是更具体的types.FunctionType

>>> from dask import delayed
>>> def inc(x):
...     return x + 1
... 
>>> callable(inc)
True
>>> callable(delayed(inc))
True
在某些方面,

callable()isinstance(..., types.FunctionType更为“广泛”的检查,因为纯函数不是唯一可调用的函数。定义.__call__()的类的实例也是如此。 Delayed does indeed define .__call__()类,因此很适合这里的费用。