मैंने अतीत में eval()
(और अभी भी समय-समय पर) का उपयोग त्वरित और गंदे संचालन के दौरान डेटा मालिश करने के लिए किया है। यह टूलकिट का हिस्सा है जिसका उपयोग नौकरी पाने के लिए किया जा सकता है, लेकिन किसी भी चीज के लिए कभी भी इस्तेमाल नहीं किया जाना चाहिए जिसका उपयोग आप उत्पादन में उपयोग करने की योजना बना रहे हैं जैसे कि कमांड लाइन टूल्स या स्क्रिप्ट्स, दूसरे में उल्लिखित सभी कारणों से जवाब।
आप अपने उपयोगकर्ताओं पर भरोसा नहीं कर सकते - कभी-कभी सही काम करने के लिए। ज्यादातर मामलों में वे करेंगे, लेकिन आपको उन सभी चीजों को करने की उम्मीद करनी होगी जिन्हें आपने कभी नहीं सोचा था और उन सभी बगों को नहीं ढूंढ पाए जिन्हें आपने कभी उम्मीद नहीं की थी। यह ठीक है जहां eval()
एक देयता के लिए एक उपकरण होने से चला जाता है।
QuerySet
का निर्माण करते समय इसका एक आदर्श उदाहरण Django का उपयोग करेगा।
results = Foo.objects.filter(whatever__contains='pizza')
आप प्रोग्राम तर्क बताए रहे हैं, तो आप इस तरह कुछ करने के लिए सोच सकते हैं:
results = eval("Foo.objects.filter(%s__%s=%s)" % (field, matcher, value))
लेकिन वहाँ है मापदंडों एक सवाल के पारित कर दिया कीवर्ड तर्क, कि कुछ इस तरह दिखाई स्वीकार करता है हमेशा एक बेहतर तरीका है कि eval()
, जो संदर्भ द्वारा एक शब्दकोश गुजर रहा है का उपयोग नहीं करता:
results = Foo.objects.filter(**{'%s__%s' % (field, matcher): value})
इसे इस तरह करने से, यह न केवल तेजी से perfo है rmance-wise, लेकिन सुरक्षित और अधिक पाइथोनिक भी।
कहानी का नैतिक? लगभग निश्चित रूप से यह करने के लिए एक बेहतर तरीका है, क्योंकि वहाँ हमेशा
eval()
का प्रयोग छोटे कार्यों, परीक्षण, और सही मायने में अस्थायी बातों के लिए ठीक, लेकिन स्थायी उपयोग के लिए बुरा है!
क्या आप "एकाधिक स्थानों" से कुछ उद्धरण प्रदान कर सकते हैं ताकि यह स्पष्ट किया जा सके कि आप किस टिप्पणी पर आधारित हैं। यह जानना महत्वपूर्ण है कि आप क्या पढ़ते हैं जो निष्कर्ष निकाला जाता है कि उन्हें टालना चाहिए। यह एक साधारण मुद्दा नहीं है, और आपको अपने प्रश्न को स्पष्ट करने के लिए जानकारी का स्रोत प्रदान करने की आवश्यकता है। –
आम तौर पर, जो मुझे याद है (जैसा कि मैंने पिछले कुछ वर्षों में इन स्थानों को बुकमार्क नहीं किया है), चेतावनियां "निश्चित रूप से, इस मुद्दे को हल करने के लिए 'eval()' का उपयोग कर सकती हैं, लेकिन यह शरारती होगी । " – Isaac
मुझे लगता है कि सबसे हालिया उदाहरण प्रोग्राम के भीतर नियंत्रण प्रवाह के साधन के रूप में 'exec()' का उपयोग कर रहा था। – Isaac