পাইথনের উত্স অবজেক্ট.c থেকে :
/* Test whether an object can be called */
int
PyCallable_Check(PyObject *x)
{
if (x == NULL)
return 0;
if (PyInstance_Check(x)) {
PyObject *call = PyObject_GetAttrString(x, "__call__");
if (call == NULL) {
PyErr_Clear();
return 0;
}
/* Could test recursively but don't, for fear of endless
recursion if some joker sets self.__call__ = self */
Py_DECREF(call);
return 1;
}
else {
return x->ob_type->tp_call != NULL;
}
}
এটা বলে:
- যদি কোনও বস্তুটি কোনও শ্রেণীর উদাহরণ হয় তবে যদি এটির
__call__
বৈশিষ্ট্য থাকে তবে তা কলযোগ্য ।
- অন্য বস্তুর
x
callable হয় iff x->ob_type->tp_call != NULL
এর Desciption tp_call
ক্ষেত্র :
ternaryfunc tp_call
কোনও ক্রিয়াকলাপের জন্য একটি alচ্ছিক পয়েন্টার যা বস্তুকে কল করার জন্য প্রয়োগ করে। যদি বস্তুটি কলযোগ্য না হয় তবে এটি NULL হওয়া উচিত। স্বাক্ষর পিওবজেক্ট_ক্যাল () এর মতো। এই ক্ষেত্রটি সাব-টাইপ দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত।
callable
প্রদত্ত বস্তুটি কলযোগ্য কিনা তা নির্ধারণ করতে আপনি সর্বদা অন্তর্নির্মিত ফাংশনটি ব্যবহার করতে পারেন ; বা আরও ভাল কেবল এটি কল করুন এবং TypeError
পরে ধরা । callable
পাইথন 3.0 এবং 3.1 এ সরানো হয়েছে, ব্যবহার করুন callable = lambda o: hasattr(o, '__call__')
বা isinstance(o, collections.Callable)
।
উদাহরণ, একটি সরল ক্যাশে বাস্তবায়ন:
class Cached:
def __init__(self, function):
self.function = function
self.cache = {}
def __call__(self, *args):
try: return self.cache[args]
except KeyError:
ret = self.cache[args] = self.function(*args)
return ret
ব্যবহার:
@Cached
def ack(x, y):
return ack(x-1, ack(x, y-1)) if x*y else (x + y + 1)
স্ট্যান্ডার্ড লাইব্রেরি, ফাইল site.py
, অন্তর্নির্মিত সংজ্ঞা exit()
এবং quit()
ফাংশন থেকে উদাহরণ :
class Quitter(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Use %s() or %s to exit' % (self.name, eof)
def __call__(self, code=None):
# Shells like IDLE catch the SystemExit, but listen when their
# stdin wrapper is closed.
try:
sys.stdin.close()
except:
pass
raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')