Exec ফাংশন গতিশীলভাবে পাইথন প্রোগ্রামের কোড চালাতে পারে। কোডটি এই ফাংশনে স্ট্রিং বা অবজেক্ট কোড হিসাবে পাস করা যেতে পারে। স্ট্রিংটি প্রথম পার্স করা এবং কোনো সিনট্যাক্স ত্রুটির জন্য চেক করার সময় অবজেক্ট কোডটি কার্যকর করা হয়। যদি কোন সিনট্যাক্স ত্রুটি না থাকে, তাহলে পার্স করা স্ট্রিংটি একটি পাইথন স্টেটমেন্ট হিসাবে কার্যকর করা হয়।
exec() ফাংশনের জন্য সিনট্যাক্স
exec(object, globals, locals)
কোথায়
-
অবজেক্ট − একটি স্ট্রিং বা একটি কোড অবজেক্ট পদ্ধতিতে চলে গেছে।
-
গ্লোবাল − উপলব্ধ বিশ্বব্যাপী পদ্ধতি এবং ভেরিয়েবলের একটি অভিধান।
-
স্থানীয়রা - উপলব্ধ স্থানীয় পদ্ধতি এবং ভেরিয়েবলের একটি অভিধান।
পাসিং স্ট্রিং
নিচের উদাহরণে আমরা exec() ফাংশনে স্ট্রিং হিসেবে কোডের একটি লাইন পাস করি। Itr পার্স করা হয় এবং আউটপুট দেওয়ার জন্য কার্যকর করা হয়।
x = 9 exec ('print(5*x)')
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
45
পাসিং কোড অবজেক্ট
এখন আমরা দেখি কিভাবে একাধিক কোড স্টেটমেন্ট সহ কোডের ব্লক পাস করা যায়। যেহেতু এটি একটি কোড অবজেক্ট, এটি সরাসরি ফলাফল প্রদান করে কার্যকর হয়। অনুগ্রহ করে লক্ষ্য করুন আমরা কীভাবে সঠিক ইন্ডেনশন সহ একটি পাইথন কোড ব্লক তৈরি করতে \n এবং স্থান ব্যবহার করেছি৷
উদাহরণ
prog_block = 'x = 3 \nif(x < 5): \n print x*x' exec(prog_block)
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
9
গ্লোবাল এবং স্থানীয় প্যারামিটার ছাড়াই
যখন আমরা গ্লোবাল এবং স্থানীয় প্যারামিটারের জন্য কোনো মান পাস করি না তখন আমরা প্রোগ্রামে আমদানি করা প্যাকেজ অনুযায়ী ডিফল্ট উপলব্ধ ফাংশন পাই। নীচের উদাহরণে আমরা দেখি যে কোডটি আমাদের উপলব্ধ সমস্ত ফাংশন দেয় যখন গ্লোবাল এবং স্থানীয় উভয় প্যারামিটার মান বাদ দেওয়া হয়।
from time import * exec("print(dir())")
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_dh', '_exit_code', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15', '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'clock', 'copysign', 'cos', 'cosh', 'ctime', 'daylight', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'get_ipython', 'gmtime', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'localtime', 'log', 'log10', 'log1p', 'mktime', 'modf', 'pi', 'pow', 'prog', 'prog_block', 'quit', 'radians', 'sin', 'sinh', 'sleep', 'sqrt', 'strftime', 'strptime', 'struct_time', 'tan', 'tanh', 'time', 'timezone', 'trunc', 'tzname', 'x']
গ্লোবাল প্যারামিটার সহ বিধিনিষেধ প্রয়োগ করা
আমরা গ্লোবাল প্যারামিটার হিসাবে একটি খালি অভিধানে পাস করে আমদানি করা মডিউলের যেকোনো ফাংশনে অ্যাক্সেস সীমাবদ্ধ করতে পারি। এই ক্ষেত্রে ফলাফলটি শুধুমাত্র অন্তর্নির্মিত ফাংশন দেখাবে এবং এটি আমদানি করা মডিউল থেকে কোন ফাংশন দেখাবে না। এভাবেই আমরা সীমাবদ্ধ করি এবং ফাংশনকে আরও সুরক্ষিত করি।
উদাহরণ
from time import * exec("print(dir())",{})
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
['__builtins__']
শুধুমাত্র নির্বাচিত ফাংশনের অনুমতি দেওয়া হচ্ছে
এরপরে আমরা দেখব কিভাবে আমরা আমদানি করা মডিউল থেকে exec() পদ্ধতিতে শুধুমাত্র কিছু নির্বাচিত ফাংশন প্রয়োগ করতে পারি। নীচের উদাহরণে আমরা গ্লোবাল বিকল্পের সাথে একটি প্যারামিটার হিসাবে শুধুমাত্র প্রয়োজনীয় ফাংশনের অনুমতি দিই। লোকালটাইম() ফাংশন হল টাইম মডিউলের অংশ যা প্রোগ্রামে আমদানি করা হয়৷ উদাহরণ
from time import * exec("print lclt()",{"lclt":localtime})
আউটপুট
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
time.struct_time(tm_year=2019, tm_mon=7, tm_mday=19, tm_hour=12, tm_min=33, tm_sec=53, tm_wday=4, tm_yday=200, tm_isdst=0)
স্থানীয় পরামিতি পাস করা
আমরা স্থানীয় পরামিতি ব্যবহার করে এবং সম্পূর্ণরূপে বিল্ট ইন ফাংশন বাদ দিয়ে আমদানি করা মডিউল গঠনের বিভিন্ন ফাংশনের ব্যবহার সীমাবদ্ধ করতে পারি। নিচের উদাহরণে আমরা বিল্ট-ইন গ্লোবাল প্যারামিটারের মান হিসেবে None বেছে নিই।
উদাহরণ
from time import * exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})
উপরের কোডটি চালানো আমাদের নিম্নলিখিত ফলাফল দেয় -
['dir', 'gtime', 'print']