অ্যারোনস্টার্লিং দ্বারা ইতিমধ্যে প্রশ্নের উত্তর দেওয়া হয়েছে
তবে, কেউ কীভাবে ভুডিয়ালগুলি হুডের নীচে সংরক্ষণ করা হয় সে সম্পর্কে আগ্রহী হতে পারে।
স্নিপেটে আসার আগে:
বন্ধগুলি এমন ফাংশন যা তাদের ঘেরের পরিবেশ থেকে পরিবর্তনশীল হয় inherit যখন আপনি কোনও ফাংশন কলব্যাককে অন্য কোনও ক্রিয়াকলাপের জন্য আর্গুমেন্ট হিসাবে পাস করবেন যা I / O করবে তখন, এই কলব্যাক ফাংশনটি পরবর্তী সময়ে শুরু করা হবে, এবং এই ফাংশনটি প্রায় জাদুকরভাবে - উপলভ্য সমস্ত ভেরিয়েবলগুলি সহ এটি প্রাসঙ্গিকভাবে মনে রাখবেন সেই প্রসঙ্গে
যদি কোনও ফাংশন ফ্রি ভেরিয়েবল ব্যবহার না করে তবে এটি বন্ধের রূপ দেয় না।
যদি অন্য কোনও অভ্যন্তরীণ স্তর থাকে যা নিখরচায় ভেরিয়েবল ব্যবহার করে - সমস্ত পূর্ববর্তী স্তরগুলি লেজিকাল পরিবেশ সংরক্ষণ করে (উদাহরণের শেষে)
ফাংশন বৈশিষ্ট্য func_closure
মধ্যে পাইথন <3.x বা __closure__
পাইথন মধ্যে> 3.x সংরক্ষণ বিনামূল্যে ভেরিয়েবল।
পাইথনের প্রতিটি ফাংশনটিতে এই ক্লোজার বৈশিষ্ট্য রয়েছে তবে কোনও বিনামূল্যে ভেরিয়েবল না থাকলে এটি কোনও সামগ্রী সংরক্ষণ করে না।
উদাহরণস্বরূপ: ক্লোজার অ্যাট্রিবিউটসের তবে কোনও ফ্রি ভেরিয়েবল নেই বলে ভিতরে কোনও সামগ্রী নেই।
>>> def foo():
... def fii():
... pass
... return fii
...
>>> f = foo()
>>> f.func_closure
>>> 'func_closure' in dir(f)
True
>>>
নোট: নিখরচায় বৈচিত্র্য একটি ক্লোজার তৈরি করা আবশ্যক।
আমি উপরের মত একই স্নিপেট ব্যবহার করে ব্যাখ্যা করব:
>>> def make_printer(msg):
... def printer():
... print msg
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer() #Output: Foo!
এবং সমস্ত পাইথন ফাংশনগুলির একটি ক্লোজার অ্যাট্রিবিউট থাকে সুতরাং আসুন একটি ক্লোজার ফাংশনের সাথে যুক্ত এনক্লোজিং ভেরিয়েবলগুলি পরীক্ষা করা যাক।
func_closure
ফাংশনটির জন্য এখানে বৈশিষ্ট্য দেওয়া আছেprinter
>>> 'func_closure' in dir(printer)
True
>>> printer.func_closure
(<cell at 0x108154c90: str object at 0x108151de0>,)
>>>
দ্য closure
অ্যাট্রিবিউট সেল বস্তু যা ভেরিয়েবল এনক্লোজিং সুযোগ সংজ্ঞায়িত বিবরণ ধারণ একটি tuple ফেরৎ।
ফানক_ক্লোজারের প্রথম উপাদান যা কোনওটিই হতে পারে না এমন ফাংশনটির মুক্ত ভেরিয়েবলগুলির জন্য বাইন্ডিংগুলি ধারণ করে এমন কোষগুলির একটি টুপল এবং এটি কেবল পঠনযোগ্য।
>>> dir(printer.func_closure[0])
['__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
>>>
উপরের আউটপুটটিতে আপনি দেখতে পাচ্ছেন cell_contents
, আসুন এটি কী সংরক্ষণ করে তা দেখুন:
>>> printer.func_closure[0].cell_contents
'Foo!'
>>> type(printer.func_closure[0].cell_contents)
<type 'str'>
>>>
সুতরাং, যখন আমরা ফাংশনটি ডাকি printer()
, এটির মধ্যে সঞ্চিত মানটি অ্যাক্সেস করেcell_contents
। এভাবেই আমরা 'ফু' হিসাবে আউটপুটটি পেয়েছি!
আবার আমি কিছু পরিবর্তন সহ উপরের স্নিপেট ব্যবহার করে ব্যাখ্যা করব:
>>> def make_printer(msg):
... def printer():
... pass
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer.func_closure
>>>
উপরের স্নিপেটে, আমি প্রিন্টারের ফাংশনের ভিতরে চিত্র মুদ্রণ করি না, সুতরাং এটি কোনও মুক্ত পরিবর্তনশীল তৈরি করে না। কোনও মুক্ত পরিবর্তনশীল না থাকায় বন্ধের অভ্যন্তরে কোনও সামগ্রী থাকবে না। ঠিক উপরে যা আমরা উপরে দেখি।
এখন আমি এর Free Variable
সাথে সমস্ত কিছু পরিষ্কার করার জন্য আরও একটি আলাদা স্নিপেট ব্যাখ্যা করব Closure
:
>>> def outer(x):
... def intermediate(y):
... free = 'free'
... def inner(z):
... return '%s %s %s %s' % (x, y, free, z)
... return inner
... return intermediate
...
>>> outer('I')('am')('variable')
'I am free variable'
>>>
>>> inter = outer('I')
>>> inter.func_closure
(<cell at 0x10c989130: str object at 0x10c831b98>,)
>>> inter.func_closure[0].cell_contents
'I'
>>> inn = inter('am')
সুতরাং, আমরা দেখতে পাচ্ছি যে func_closure
সম্পত্তি একটি ক্লোজার কোষগুলির একটি দ্বিখণ্ডিত, আমরা সেগুলি এবং তাদের বিষয়বস্তু স্পষ্টভাবে উল্লেখ করতে পারি - একটি ঘরে "সেল_কন্টেন্টস" এর সম্পত্তি রয়েছে
>>> inn.func_closure
(<cell at 0x10c9807c0: str object at 0x10c9b0990>,
<cell at 0x10c980f68: str object at 0x10c9eaf30>,
<cell at 0x10c989130: str object at 0x10c831b98>)
>>> for i in inn.func_closure:
... print i.cell_contents
...
free
am
I
>>>
এখানে যখন আমরা কল করব তখন inn
এটি সংরক্ষণের সমস্ত বিনামূল্যে ভেরিয়েবলগুলি উল্লেখ করবে weI am free variable
>>> inn('variable')
'I am free variable'
>>>