मुझे कुछ कोड के साथ एक स्थिति है जहां eval()
एक संभावित समाधान के रूप में आया था। अब eval()
का उपयोग करने के लिए मेरे पास कभी भी नहीं था, लेकिन संभावित खतरे के कारण मुझे बहुत सारी जानकारी मिली है। उस ने कहा, मैं इसका उपयोग करने के बारे में बहुत सावधान हूँ।पायथन के eval() बनाम ast.literal_eval() बनाम?
कहाँ datamap
जरूरतों एक शब्दकोश होने के लिए:
मेरे स्थिति मैं इनपुट एक उपयोगकर्ता द्वारा दिया जा रहा है है। मैंने चारों ओर खोज की और पाया कि eval()
इसे काम कर सकता है। मैंने सोचा कि मैं डेटा का उपयोग करने से पहले इनपुट के प्रकार की जांच करने में सक्षम हो सकता हूं और एक व्यवहार्य सुरक्षा सावधानी बरतनी होगी।
datamap = eval(raw_input('Provide some data here: ')
if not isinstance(datamap, dict):
return
मैंने दस्तावेज़ों के माध्यम से पढ़ा और मैं अभी भी अस्पष्ट हूं कि यह सुरक्षित होगा या नहीं। क्या उत्तीर्ण डेटा के मूल्यांकन के तुरंत बाद या datamap
परिवर्तनीय के बाद मूल्यांकन किया जाता है?
ast
मॉड्यूल .literal_eval()
एकमात्र सुरक्षित विकल्प है?
यह 100% सही सलाह नहीं है क्योंकि किसी भी bitwise ऑपरेटरों (या अधिभारित ऑपरेटरों) विफल हो जाएगा। उदाहरण के लिए। 'ast.literal_eval (" 1 और 1 ") 'एक त्रुटि फेंक देगा लेकिन' eval ("1 और 1") 'नहीं होगा। –
बस उत्सुक। अगर हम "1 और 1" जैसी कुछ उम्मीद कर रहे हैं तो क्या हमें अभिव्यक्ति पार्सर्स या कुछ का उपयोग नहीं करना चाहिए? – thelinuxer
@thelinuxer आपको अभी भी चाहिए, हां; आप बस इस तरह के कुछ के लिए 'ast.literal_eval' का उपयोग करने में सक्षम नहीं होंगे (उदा। आप मैन्युअल रूप से एक पार्सर लागू कर सकते हैं)। – Volatility