যদি আপনি শিখে থাকেন তবে C++
আপনাকে অবশ্যই পরিচিত function object
বা তার functor
অর্থ কোনও বস্তু যা পারছে be called as if it is a function
।
সি ++ এ, 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]
বিচারক ওয়েদার ফান্টার কলযোগ্য ble আপনি দেখতে পাচ্ছেন যে এগুলি সকলেই কলযোগ্য।
res = [callable(xfunc) for xfunc in xfuncs]
print("functors callable:")
print(res)
"""
functors callable:
[True, True, True, True, True, True, True, True]
"""
ফান্টারের ধরণ (প্রকার। এক্সএক্সএক্সএক্স) বিচার করুন। তারপরে ফান্টারের ধরণগুলি সমস্ত এক নয়।
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