आप सीखा है तो C++, आप से परिचित होना चाहिए function objectया functor, किसी भी वस्तु जो कर सकते हैं इसका मतलब हैbe called as if it is a function ।
C ++ में, an ordinary functionएक फ़ंक्शन ऑब्जेक्ट है, और इसलिए एक फ़ंक्शन पॉइंटर है; अधिक सामान्यतः, एक वर्ग की एक वस्तु है जो परिभाषित करता है operator()। सी ++ 11 और अधिक से अधिक में, the lambda expressionहै functorभी।
समानता, पायथन में, वे functorsसभी हैं callable। An ordinary functionकॉल करने योग्य हो सकता है, कॉल करने योग्य हो सकता है, कॉल करने योग्य a lambda expressionहो सकता है, functional.partialकॉल के उदाहरण class with a __call__() methodकॉल करने योग्य हो सकते हैं।
ठीक है, वापस सवाल पर जाएं: I have a variable, x, and I want to know whether it is pointing to a function or not.
यदि आप मौसम को आंकना चाहते हैं तो ऑब्जेक्ट एक फ़ंक्शन की तरह काम करता है, तो callableविधि द्वारा सुझाया गया है@John Feminella ठीक है।
यदि आप judge whether a object is just an ordinary function or not(कॉल करने योग्य श्रेणी का उदाहरण, या लैम्ब्डा एक्सप्रेशन नहीं) चाहते हैं, तो xtypes.XXXसुझाया गया @Ryanएक बेहतर विकल्प है।
फिर मैं उन कोड का उपयोग करके एक प्रयोग करता हूं:
#!/usr/bin/python3
# 2017.12.10 14:25:01 CST
# 2017.12.10 15:54:19 CST
import functools
import types
import pprint
एक वर्ग और एक साधारण कार्य को परिभाषित करें।
class A():
def __call__(self, a,b):
print(a,b)
def func1(self, a, b):
print("[classfunction]:", a, b)
@classmethod
def func2(cls, a,b):
print("[classmethod]:", a, b)
@staticmethod
def func3(a,b):
print("[staticmethod]:", a, b)
def func(a,b):
print("[function]", a,b)
फंक्शंस को परिभाषित करें:
#(1.1) built-in function
builtins_func = open
#(1.2) ordinary function
ordinary_func = func
#(1.3) lambda expression
lambda_func = lambda a : func(a,4)
#(1.4) functools.partial
partial_func = functools.partial(func, b=4)
#(2.1) callable class instance
class_callable_instance = A()
#(2.2) ordinary class function
class_ordinary_func = A.func1
#(2.3) bound class method
class_bound_method = A.func2
#(2.4) static class method
class_static_func = A.func3
फंक्शंस की सूची और प्रकार की सूची को परिभाषित करें:
## list of functors
xfuncs = [builtins_func, ordinary_func, lambda_func, partial_func, class_callable_instance, class_ordinary_func, class_bound_method, class_static_func]
## list of type
xtypes = [types.BuiltinFunctionType, types.FunctionType, types.MethodType, types.LambdaType, functools.partial]
जज विटर फनकार को कॉल करने योग्य है। जैसा कि आप देख सकते हैं, वे सभी कॉल करने योग्य हैं।
res = [callable(xfunc) for xfunc in xfuncs]
print("functors callable:")
print(res)
"""
functors callable:
[True, True, True, True, True, True, True, True]
"""
फ़नकार के प्रकार (type.XXX) का न्याय करें। फिर फंक्शंस के प्रकार सभी समान नहीं हैं।
res = [[isinstance(xfunc, xtype) for xtype in xtypes] for xfunc in xfuncs]
## output the result
print("functors' types")
for (row, xfunc) in zip(res, xfuncs):
print(row, xfunc)
"""
functors' types
[True, False, False, False, False] <built-in function open>
[False, True, False, True, False] <function func at 0x7f1b5203e048>
[False, True, False, True, False] <function <lambda> at 0x7f1b5081fd08>
[False, False, False, False, True] functools.partial(<function func at 0x7f1b5203e048>, b=4)
[False, False, False, False, False] <__main__.A object at 0x7f1b50870cc0>
[False, True, False, True, False] <function A.func1 at 0x7f1b5081fb70>
[False, False, True, False, False] <bound method A.func2 of <class '__main__.A'>>
[False, True, False, True, False] <function A.func3 at 0x7f1b5081fc80>
"""
मैं डेटा का उपयोग करके कॉल करने योग्य फ़ंक्शनल के प्रकारों की एक तालिका तैयार करता हूं।

फिर आप उपयुक्त प्रकार के फंक्शंस चुन सकते हैं।
जैसे कि:
def func(a,b):
print("[function]", a,b)
>>> callable(func)
True
>>> isinstance(func, types.FunctionType)
True
>>> isinstance(func, (types.BuiltinFunctionType, types.FunctionType, functools.partial))
True
>>>
>>> isinstance(func, (types.MethodType, functools.partial))
False