eval () विधि इस पद्धति पर पारित अभिव्यक्ति को पार्स करती है और कार्यक्रम के भीतर अभिव्यक्ति को चलाती है। दूसरे शब्दों में, यह एक स्ट्रिंग को एक पायथन प्रोग्राम के अंदर कोड के रूप में व्याख्या करता है।
सिंटैक्स
eval के लिए सिंटैक्स नीचे दिया गया है -
eval(expression, globals=None, locals=None)
कहां
-
अभिव्यक्ति - यह विधि पर पारित अजगर अभिव्यक्ति है।
-
वैश्विक - उपलब्ध वैश्विक विधियों और चरों का एक शब्दकोश।
-
स्थानीय लोग - उपलब्ध स्थानीय विधियों और चरों का शब्दकोश।
नीचे दिए गए उदाहरण में हम उपयोगकर्ता को एक एक्सप्रेशन को सीरेट करने और उस एक्सप्रेशन का मूल्यांकन करने के लिए एक पायथन प्रोग्राम चलाने की अनुमति देते हैं। तो यह डायनामिक कोड बनाने में मदद करता है।
उदाहरण
# expression to be evaluated user_expr = raw_input("Enter an expression in terms of variable a):") #nter the value of variable a = int(raw_input("Enter the value of a:")) # evaluate the expression result = eval(user_expr) # printing evaluated result print("Result = {}".format(result))
आउटपुट
उपरोक्त कोड को चलाने से हमें निम्नलिखित परिणाम मिलते हैं -
Enter an expression in terms of variable a):a*(a-3)+a^2 Enter the value of a:7 Result = 33
eval के साथ सुरक्षा समस्या ()
वेब एप्लिकेशन या डेस्कटॉप प्रोग्राम से जुड़े कार्यक्रमों के लिए एक मौका है कि इस तरह की eval () विधि का उपयोग सुरक्षा कमजोरियां पैदा करेगा क्योंकि प्रोग्राम चलाने से अभिव्यक्ति की आपूर्ति हो सकती है जो फाइलों को हटाने या सिस्टम से संवेदनशील डेटा प्राप्त करने के लिए सिस्टम कमांड हैं। इसे रोकने के लिए एक कदम के रूप में हम eval() फंक्शन को कुछ चुनिंदा फंक्शन या वेरिएबल तक सीमित कर सकते हैं।
इन कमजोरियों को रोकने के उपाय नीचे दिए गए हैं -
eval() विधि में स्थानीय और वैश्विक दोनों चरों को छोड़ दें।
इस तरह इसका मूल्यांकन केवल वर्तमान दायरे में किया जाएगा और इस दायरे से बाहर अन्य चर नहीं खोजे जाएंगे।
केवल स्थानीय मापदंडों को छोड़ दें
स्थानीय चर को छोड़ने पर, सभी चर वैश्विक चर के रूप में दायरे में आते हैं। आगे हम एक खाली डिक्शनरी को ग्लोबल वैरिएबल के रूप में पास करते हैं और यह केवल बिल्ट-इन वेरिएबल्स को उपलब्ध होने की अनुमति देता है, भले ही हमने प्रोग्राम में अन्य लाइब्रेरी को इंपोर्ट किया हो।
उदाहरण
from time import * print(eval('dir()', {}))<आउटपुट>
उपरोक्त कोड को चलाने से हमें निम्नलिखित परिणाम मिलते हैं -
['__builtins__']
आगे हम आयातित पुस्तकालय से केवल कुछ विधियों को कार्यक्रम के लिए उपलब्ध होने की अनुमति दे सकते हैं।
from time import * print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))
आउटपुट
उपरोक्त कोड को चलाने से हमें निम्नलिखित परिणाम मिलते हैं -
['Localtime', '__builtins__', 'sleeptime']
चुनिंदा कार्यों को वैश्विक और स्थानीय दोनों में पास करना
हम स्थानीय और वैश्विक दोनों दायरे में फ़ंक्शन की उपलब्धता को प्रतिबंधित कर सकते हैं, किसी भी अंतर्निहित और स्थानीय रूप से आयातित पुस्तकालयों में से कुछ को अनुमति नहीं दे सकते हैं। नीचे दिए गए उदाहरण में हमने टाइम लाइब्रेरी से केवल gmtime मेथड उपलब्ध कराया है।
उदाहरण
from time import * a = 1445945763 print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))
आउटपुट
उपरोक्त कोड को चलाने से हमें निम्नलिखित परिणाम मिलते हैं -
time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)आउटपुट>