পাইথনে, একটি ক্লোজার হল এমন কোনও ফাংশনের উদাহরণ যা এর সাথে স্থায়ীভাবে আবদ্ধ ভেরিয়েবলগুলি রয়েছে।
আসলে, ডেটা মডেল এটি ফাংশনগুলির __closure__
বৈশিষ্ট্যটির বর্ণনাতে এটি ব্যাখ্যা করে :
ফাংশনটির বিনামূল্যে ভেরিয়েবলের জন্য বাইন্ডিংগুলি ধারণ করে এমন কোনও বা কক্ষের একটি টিপল নেই । শুধুমাত্র পাঠযোগ্য
এটি প্রদর্শন করতে:
def enclosure(foo):
def closure(bar):
print(foo, bar)
return closure
closure_instance = enclosure('foo')
স্পষ্টতই, আমরা জানি যে আমাদের এখন ভেরিয়েবলের নাম থেকে একটি ফাংশন নির্দেশিত closure_instance
। স্পষ্টতই, আমরা যদি এটি একটি বস্তুর সাথে কল করি bar
, এটি স্ট্রিংটি মুদ্রণ করা উচিত 'foo'
এবং স্ট্রিংয়ের উপস্থাপনা যা কিছু হোক bar
।
বস্তুত, STRING 'foo বিন্যাস' হয় ফাংশন উদাহরণস্বরূপ আবদ্ধ, এবং আমরা সরাসরি তা এখানে পড়তে পারেন অ্যাক্সেস করার মাধ্যমে, cell_contents
প্রথম (এবং একমাত্র) এর tuple মধ্যে কক্ষের অ্যাট্রিবিউট __closure__
বৈশিষ্ট্য:
>>> closure_instance.__closure__[0].cell_contents
'foo'
একদিকে যেমন, সিআইপি ডকুমেন্টেশনে সেল অবজেক্টগুলি বর্ণিত হয়েছে:
"সেল" অবজেক্টগুলি একাধিক স্কোপের দ্বারা রেফারেন্সযুক্ত ভেরিয়েবলগুলি প্রয়োগ করতে ব্যবহৃত হয়
এবং আমরা আমাদের ক্লোজারের ব্যবহারটি প্রদর্শন করতে পারি যে 'foo'
ফাংশনে আটকে আছে এবং পরিবর্তন হয় না তা উল্লেখ করে:
>>> closure_instance('bar')
foo bar
>>> closure_instance('baz')
foo baz
>>> closure_instance('quux')
foo quux
এবং কিছুই এটিকে পরিবর্তন করতে পারে না:
>>> closure_instance.__closure__ = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: readonly attribute
আংশিক ফাংশন
প্রদত্ত উদাহরণটি বন্ধকে আংশিক ফাংশন হিসাবে ব্যবহার করে, তবে এটি যদি আমাদের একমাত্র লক্ষ্য হয় তবে একই লক্ষ্যটি সম্পন্ন করা যায় functools.partial
>>> from __future__ import print_function
>>> partial_function = functools.partial(print, 'foo')
>>> partial_function('bar')
foo bar
>>> partial_function('baz')
foo baz
>>> partial_function('quux')
foo quux
আরও জটিল জটিলতা রয়েছে যা আংশিক ফাংশন উদাহরণের সাথে খাপ খায় না, এবং সময় হিসাবে সময় হিসাবে আমি এগুলি আরও প্রদর্শন করব।
nonlocal
পাইথন 3 যোগ করা হয়েছিল, পাইথন 2.x ছিল না পুরো উপর, read-write বন্ধ (অর্থাত আপনি ভেরিয়েবল ওপরে মুখ বন্ধ পড়তে পারি, কিন্তু তাদের মান বদলাতে নয়)