পাইথনে, একটি ক্লোজার হল এমন কোনও ফাংশনের উদাহরণ যা এর সাথে স্থায়ীভাবে আবদ্ধ ভেরিয়েবলগুলি রয়েছে।
আসলে, ডেটা মডেল এটি ফাংশনগুলির __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 বন্ধ (অর্থাত আপনি ভেরিয়েবল ওপরে মুখ বন্ধ পড়তে পারি, কিন্তু তাদের মান বদলাতে নয়)