लॉट के लिए यहाँ अच्छा उत्तरों की, लेकिन कोई भी के संदर्भ में eval
के उपयोग का वर्णन इसका globals=
और locals=
kwargs। इन्हें विधि के माध्यम से उपलब्ध विधियों को सीमित करने के लिए उपयोग किया जा सकता है। उदाहरण के लिए यदि आप एक ताजा अजगर दुभाषिया locals()
लोड और globals()
एक ही हो सकता है और कुछ इस तरह दिखेगा यदि:
>>> globals()
{'__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__doc__': None,
'__spec__': None, '__builtins__': <module 'builtins' (built-in)>,
'__package__': None, '__name__': '__main__'}
वहाँ निश्चित रूप से builtins
मॉड्यूल है कि एक प्रणाली के लिए महत्वपूर्ण नुकसान कर सकते हैं के भीतर तरीके हैं। लेकिन कुछ भी और हर चीज को अवरुद्ध करना संभव है जिसे हम उपलब्ध नहीं करना चाहते हैं। चलो एक उदाहरण लेते हैं। मान लें कि हम सिस्टम पर उपलब्ध कोर के डोमेन का प्रतिनिधित्व करने के लिए एक सूची बनाना चाहते हैं। मेरे लिए मेरे पास 8 कोर हैं इसलिए मैं एक सूची [1, 8]
चाहता हूं।
>>>from os import cpu_count()
>>>eval('[1, cpu_count()'])
[1, 8]
इसी प्रकार सभी __builtins__
उपलब्ध है।
>>>eval('abs(-1)')
1
ठीक है। तो वहां हम एक तरीका देखते हैं जिसे हम उजागर करना चाहते हैं और एक का उदाहरण (उनमें से कई जो अधिक कपटपूर्ण हो सकते हैं) विधि जिसे हम उजागर नहीं करना चाहते हैं। तो सब कुछ ब्लॉक करने देता है।
>>>eval('[1, cpu_count()]', {'__builtins__':None}, {})
TypeError: 'NoneType' object is not subscriptable
हम प्रभावी रूप से __builtins__
तरीकों के सभी अवरुद्ध कर दिया है और इस तरह के रूप में हमारे सिस्टम में सुरक्षा के एक स्तर लाया। इस बिंदु पर हम उन विधियों में वापस जोड़ना शुरू कर सकते हैं जिन्हें हम उजागर करना चाहते हैं।
>>>from os import cpu_count
>>>exposed_methods = {'cpu_count': cpu_count}
>>>eval('cpu_count()', {'__builtins__':None}, exposed_methods)
8
>>>eval('abs(cpu_count())', {'__builtins__':None}, exposed_methods)
TypeError: 'NoneType' object is not subscriptable
अब हमारे पास cpu_count विधि उपलब्ध है जबकि हम जो कुछ भी नहीं चाहते हैं उसे अवरुद्ध करते हुए। मेरी राय में यह अन्य शक्तिशालीों के दायरे से बहुत शक्तिशाली और स्पष्ट रूप से एक सामान्य कार्यान्वयन नहीं है। इस तरह के कुछ के लिए कई उपयोग हैं और जब तक इसे सही तरीके से संभाला जाता है, मुझे व्यक्तिगत रूप से eval
का उपयोग सुरक्षित मूल्य के लिए किया जा सकता है।
एनबी।
इन kwargs
के बारे में कुछ और अच्छा है कि आप अपने कोड के लिए शॉर्टेंड का उपयोग शुरू कर सकते हैं। आइए मान लें कि आप कुछ आयातित पाठ निष्पादित करने के लिए पाइपलाइन के हिस्से के रूप में eval का उपयोग करते हैं। टेक्स्ट को सटीक कोड रखने की आवश्यकता नहीं है, यह कुछ टेम्पलेट फ़ाइल प्रारूप का पालन कर सकता है, और फिर भी आप जो भी चाहें निष्पादित कर सकते हैं। उदाहरण के लिए:
>>>from os import cpu_count
>>>eval('[1,cores]', {'__builtins__': None}, {'cores': cpu_count()})
[1, 8]
क्या यह एक पायथन 3.x पुस्तक या 2.x एक है? किसी भी तरह से, 'eval' के इस तरह के उदार उपयोग से पता चलता है कि यह एक भयानक किताब है। – delnan
एर्म, बस सोच रहा है ... यह अंगूठे क्यों नीचे आया? शिकायत नहीं, बस मेरे सवालों को सुधारना चाहते हैं .. – Billjk
आपकी पुस्तक भयानक लगता है। आपको एक बेहतर किताब मिलनी चाहिए, शायद http://www.greenteapress.com/thinkpython/html/index.html –