पायथन eval ()

Eval () विधि इस विधि को दिए गए अभिव्यक्ति को पार्स करती है और प्रोग्राम के भीतर अजगर अभिव्यक्ति (कोड) को चलाती है।

सरल शब्दों में, eval()फ़ंक्शन प्रोग्राम के भीतर अजगर कोड (जिसे एक तर्क के रूप में पारित किया जाता है) चलाता है।

का सिंटैक्स eval()है:

 eval (अभिव्यक्ति, ग्लोबल्स = कोई नहीं, स्थानीय = कोई नहीं)

eval () पैरामीटर

eval()समारोह तीन पैरामीटर लेता है:

  • अभिव्यक्ति - स्ट्रिंग ने पायथन अभिव्यक्ति के रूप में पार्स और मूल्यांकन किया
  • ग्लोबल्स (वैकल्पिक) - एक शब्दकोश
  • स्थानीय (वैकल्पिक) - एक मैपिंग ऑब्जेक्ट। शब्दकोश पायथन में मानक और आमतौर पर इस्तेमाल किया जाने वाला मानचित्रण प्रकार है।

ग्लोबल्स और स्थानीय लोगों के उपयोग पर बाद में इस लेख में चर्चा की जाएगी।

Eval से वापसी मान ()

निष्कासन () विधि अभिव्यक्ति से मूल्यांकन किए गए परिणाम को लौटाती है।

उदाहरण 1: पायथन में कैसे काम करता है

 x = 1 print(eval('x + 1'))

आउटपुट

यहां, eval()फ़ंक्शन अभिव्यक्ति का मूल्यांकन करता है x + 1और printइस मूल्य को प्रदर्शित करने के लिए उपयोग किया जाता है।

उदाहरण 2: eval () का उपयोग प्रदर्शित करने के लिए व्यावहारिक उदाहरण

 # Perimeter of Square def calculatePerimeter(l): return 4*l # Area of Square def calculateArea(l): return l*l expression = input("Type a function: ") for l in range(1, 5): if (expression == 'calculatePerimeter(l)'): print("If length is ", l, ", Perimeter = ", eval(expression)) elif (expression == 'calculateArea(l)'): print("If length is ", l, ", Area = ", eval(expression)) else: print('Wrong Function') break

आउटपुट

 एक फ़ंक्शन टाइप करें: calculArea (l) यदि लंबाई 1 है, क्षेत्रफल = 1 यदि लंबाई 2 है, तो क्षेत्र = 4 यदि लंबाई 3 है, तो क्षेत्र = 9 यदि लंबाई 4 है, तो क्षेत्र = 16

Eval का उपयोग करते समय चेतावनी ()

ऐसी स्थिति पर विचार करें जहां आप एक यूनिक्स प्रणाली (macOS, लिनक्स आदि) का उपयोग कर रहे हैं और आपने osमॉड्यूल आयात किया है। ओएस मॉड्यूल एक फाइल को पढ़ने या लिखने की तरह ऑपरेटिंग सिस्टम फंक्शंस का उपयोग करने के लिए एक पोर्टेबल तरीका प्रदान करता है।

यदि आप उपयोगकर्ताओं को मूल्य का उपयोग करने की अनुमति देते हैं eval(input()), तो उपयोगकर्ता फ़ाइल बदलने के लिए आदेश जारी कर सकता है या कमांड का उपयोग करके सभी फ़ाइलों को हटा भी सकता है os.system('rm -rf *'):।

यदि आप eval(input())अपने कोड में उपयोग कर रहे हैं , तो यह जांचना एक अच्छा विचार है कि उपयोगकर्ता किन चर और तरीकों का उपयोग कर सकता है। आप देख सकते हैं कि dir () पद्धति का उपयोग करके कौन से चर और तरीके उपलब्ध हैं।

 from math import * print(eval('dir()'))

आउटपुट

' asinh ',' atan ',' atan2 ',' atanh ',' Ceil ',' comb ',' copysign ',' cos ',' cosh ',' degree ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd,' hypot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' logp ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radians ',' शेष ',' sin ',' sinh ',' sqrt ' , 'तन', 'तन', 'ताऊ', 'ट्रंक')

उपलब्ध विधियों और चर के उपयोग को प्रतिबंधित करना () में

अधिक बार नहीं, अभिव्यक्ति में उपयोग किए जाने वाले सभी उपलब्ध तरीके और चर (पहले पैरामीटर eval()) की आवश्यकता नहीं हो सकती है, या यहां तक ​​कि एक सुरक्षा छेद भी हो सकता है। आपको इन विधियों और चर के उपयोग को प्रतिबंधित करने की आवश्यकता हो सकती है eval()। आप वैकल्पिक ग्लोबल्स और स्थानीय पैरामीटर (डिक्शनरी) को eval()फंक्शन में पास करके ऐसा कर सकते हैं ।

1. जब ग्लोबल्स और लोकल पैरामीटर दोनों छूट गए

यदि दोनों मापदंडों को छोड़ दिया जाता है (जैसा कि हमारे पहले के उदाहरणों में), तो अभिव्यक्ति को मौजूदा दायरे में निष्पादित किया जाता है। आप निम्नलिखित कोड का उपयोग करके उपलब्ध चर और विधियों की जांच कर सकते हैं:

 print(eval('dir()')

2. ग्लोबल्स पैरामीटर पास करना; स्थानीय पैरामीटर को छोड़ दिया जाता है

वैश्विक और स्थानीय चर के लिए क्रमशः ग्लोबल्स और लोकल पैरामीटर (शब्दकोशों) का उपयोग किया जाता है। यदि स्थानीय शब्दकोश को छोड़ दिया जाए, तो यह ग्लोबल्स शब्दकोश में चूक जाता है। मतलब, ग्लोबल्स का उपयोग वैश्विक और स्थानीय दोनों प्रकार के चर के लिए किया जाएगा।

नोट: आप मौजूदा वैश्विक और स्थानीय शब्दकोश को क्रमशः ग्लोबल्स () और स्थानीय लोगों () में निर्मित तरीकों का उपयोग करके जांच सकते हैं।

उदाहरण 3: रिक्त शब्द को ग्लोबल्स पैरामीटर के रूप में पास करना

 from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))

आउटपुट

 ('__builtins__') ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "", पंक्ति 5, प्रिंट में (eval (25 sqrt (25) ', ()) फ़ाइल "", लाइन 1, NameError में।' sqrt 'नाम परिभाषित नहीं है

यदि आप एक खाली शब्दकोश को ग्लोबल्स के रूप में पास करते __builtins__हैं , तो केवल expression(पहले पैरामीटर को eval()) उपलब्ध हैं।

भले ही हमने mathउपरोक्त कार्यक्रम में मॉड्यूल आयात किया है , लेकिन अभिव्यक्ति गणित मॉड्यूल द्वारा प्रदान किए गए किसी भी फ़ंक्शन तक नहीं पहुंच सकती है।

उदाहरण 4: कुछ खास तरीके उपलब्ध कराना

 from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))

आउटपुट

 ('__builtins__', 'pow', 'sqrt')

यहां, अभिव्यक्ति केवल sqrt()और pow()साथ के तरीकों का उपयोग कर सकती है __builtins__

अपनी इच्छानुसार अभिव्यक्ति के लिए उपलब्ध विधि का नाम बदलना भी संभव है:

 from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))

आउटपुट

 ('__builtins__', 'power', 'square_root') 3.0

उपरोक्त कार्यक्रम में, square_root()वर्गमूल का उपयोग करके गणना करता है sqrt()। हालाँकि, sqrt()सीधे उपयोग करने का प्रयास एक त्रुटि उत्पन्न करेगा।

उदाहरण 5: बिल्ट-इन के उपयोग को प्रतिबंधित करना

आप __builtins__अभिव्यक्ति का उपयोग इस प्रकार कर सकते हैं:

 eval(expression, ('__builtins__': None))

3. ग्लोबल्स और लोकल डिक्शनरी दोनों को पास करना

आप स्थानीय शब्दकोश को पास करके उपयोग के लिए आवश्यक कार्य और चर उपलब्ध करा सकते हैं। उदाहरण के लिए:

 from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))

आउटपुट

 13.0

इस कार्यक्रम में, अभिव्यक्ति में sqrt()केवल एक विधि और चर हो सकता है । अन्य सभी विधियाँ और चर अनुपलब्ध हैं।

eval()ग्लोबल्स और लोकल डिक्शनरी पास करके उपयोग पर प्रतिबंध लगाने से आपका कोड विशेष रूप से सुरक्षित हो जाएगा, जब आप उपयोगकर्ता द्वारा eval()विधि द्वारा प्रदान किए गए इनपुट का उपयोग कर रहे हैं ।

नोट: कभी-कभी, eval()सीमित नामों के साथ भी सुरक्षित नहीं है। जब किसी वस्तु और उसके तरीकों को सुलभ बनाया जाता है, तो लगभग कुछ भी किया जा सकता है। उपयोगकर्ता इनपुट को मान्य करने का एकमात्र सुरक्षित तरीका है।

दिलचस्प लेख...