Exec फ़ंक्शन गतिशील रूप से अजगर कार्यक्रमों के कोड को निष्पादित कर सकता है। कोड को इस फ़ंक्शन में स्ट्रिंग या ऑब्जेक्ट कोड के रूप में पास किया जा सकता है। ऑब्जेक्ट कोड को वैसे ही निष्पादित किया जाता है, जब स्ट्रिंग को पहले पार्स किया जाता है और किसी सिंटैक्स त्रुटि के लिए जाँच की जाती है। यदि कोई सिंटैक्स त्रुटि नहीं है, तो पार्स की गई स्ट्रिंग को पायथन स्टेटमेंट के रूप में निष्पादित किया जाता है।
निष्पादन के लिए सिंटैक्स () फ़ंक्शन
exec(object, globals, locals)
कहां
-
ऑब्जेक्ट - एक स्ट्रिंग या कोड ऑब्जेक्ट विधि पर पारित हो गया।
-
वैश्विक - उपलब्ध वैश्विक विधियों और चरों का एक शब्दकोश।
-
स्थानीय लोग - उपलब्ध स्थानीय विधियों और चरों का शब्दकोश।
पासिंग स्ट्रिंग
नीचे दिए गए उदाहरण में हम कोड की एक पंक्ति को स्ट्रिंग के रूप में exec () फ़ंक्शन में पास करते हैं। आउटपुट देने के लिए आईटीआर को पार्स और निष्पादित किया जाता है।
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__']
केवल चयनित कार्यों की अनुमति
आगे हम देखते हैं कि हम आयातित मॉड्यूल से केवल कुछ चुने हुए कार्यों को निष्पादन () विधि में कैसे लागू कर सकते हैं। नीचे दिए गए उदाहरण में हम वैश्विक विकल्प के साथ पैरामीटर के रूप में केवल आवश्यक फ़ंक्शन की अनुमति देते हैं। लोकलटाइम () फ़ंक्शन उस समय मॉड्यूल का हिस्सा है जिसे प्रोग्राम में आयात किया जाता है। उदाहरण
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)
स्थानीय पैरामीटर पास करना
हम स्थानीय पैरामीटर का उपयोग करके और अंतर्निहित कार्यों को पूरी तरह से छोड़कर आयातित मॉड्यूल के विभिन्न कार्यों के उपयोग को भी प्रतिबंधित कर सकते हैं। नीचे दिए गए उदाहरण में हम बिल्ट-इन ग्लोबल पैरामीटर के मान के रूप में कोई नहीं चुनते हैं।
उदाहरण
from time import * exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})
उपरोक्त कोड को चलाने से हमें निम्नलिखित परिणाम मिलते हैं -
['dir', 'gtime', 'print']