2011-10-10 12 views
29

मैं वर्तमान में प्रथम वर्ष के विश्वविद्यालय के छात्रों को पाइथन पढ़ता हूं, और मुझे यह जानकर आश्चर्य हुआ कि प्रतीत होता है कि प्रतीत होता है कि input फ़ंक्शन, कि मेरे कुछ छात्रों ने (और अजीब व्यवहार से उलझन में) उपयोग करने का निर्णय लिया था, eval पर कॉल छुपा रहा था यह।क्या कच्चे_इनपुट पर पाइथन के इनपुट का उपयोग करना हमेशा उपयोगी होता है?

तो मेरा सवाल यह है कि input फ़ंक्शन कॉल eval क्यों है, और इसके लिए यह कभी भी उपयोगी होगा कि raw_input के साथ यह सुरक्षित नहीं होगा? मैं समझता हूं कि यह पायथन 3 में बदल दिया गया है, लेकिन यह पहली जगह में एक असामान्य डिजाइन निर्णय की तरह लगता है।

Python 2.x input function documentation

+7

कोड-गोल्फ –

+0

के लिए यह उपयोगी है "क्यों" का जवाब देने के लिए - पायथन का पहला आरपीएल हो सकता है 'जबकि 1: प्रिंट इनपुट() '। मैं उस प्राचीन समय पर शर्त लगाता हूं, अच्छे प्रोग्रामिंग प्रथाओं का समर्थन करना पाइथन की प्राथमिकताओं की सूची पर उतना ही अधिक नहीं था जितना कि अब है। पायथन 3 की 'जबकि सत्य: प्रिंट (eval (इनपुट()))' शायद और भी भ्रमित लग सकता है - उन सभी घोंसलेदार कोष्ठक! –

उत्तर

34

यह कभी खत्म हो गया अजगर 2 के इनपुट का उपयोग करने के लिए उपयोगी है कच्चे इनपुट?

सं


input() कोड उपयोगकर्ता यह देता मूल्यांकन करता है। यह उपयोगकर्ता के हाथों में पाइथन की पूरी शक्ति डालता है। जनरेटर एक्सप्रेशन/सूची समझ, __import__, और if/else ऑपरेटरों के साथ, सचमुच कुछ भी पाइथन एक अभिव्यक्ति के साथ प्राप्त किया जा सकता है। दुर्भावनापूर्ण उपयोगकर्ता फ़ाइलों को हटाने के लिए input() का उपयोग कर सकते हैं (__import__('os').remove('precious_file')), शेष प्रोग्राम (setattr(__import__('__main__'), 'function', lambda:42)), ... कुछ भी बंद करें।

एक सामान्य उपयोगकर्ता को सभी उन्नत कार्यक्षमता का उपयोग करने की आवश्यकता नहीं होगी। यदि आपको अभिव्यक्तियों की आवश्यकता नहीं है, तो ast.literal_eval(raw_input()) का उपयोग करें - literal_eval फ़ंक्शन सुरक्षित है।

यदि आप उन्नत उपयोगकर्ताओं के लिए लिख रहे हैं, तो उन्हें कोड इनपुट करने का एक बेहतर तरीका दें। प्लगइन्स, उपयोगकर्ता मॉड्यूल, आदि - पूर्ण पायथन वाक्यविन्यास के साथ कुछ, केवल कार्यक्षमता नहीं।

यदि आप पूरी तरह से सुनिश्चित हैं कि आप जानते हैं कि आप क्या कर रहे हैं, तो eval(raw_input()) कहें। eval चीखता है "मैं खतरनाक हूं!" प्रशिक्षित आंखों के लिए। लेकिन, बाधाएं हैं कि आपको कभी इसकी आवश्यकता नहीं होगी।


input() पुराने डिज़ाइन गलतियों कि अजगर 3 सुलझाने है में से एक था।

+0

यही वह है जो मैं सोच रहा था, भले ही मैं सोच रहा था आप 'इनपुट' की कार्यक्षमता चाहते थे, अगर आपने 'eval (raw_input()) किया था तो आप कम से कम देखेंगे कि यह खतरनाक था। और अन्यथा इसका उपयोग करने के लिए वास्तव में एक अच्छा कारण नहीं है। धन्यवाद! – luketparkinson

4

input काफी एक इंटरैक्टिव अजगर खोल के लिए एक निर्माण खंड के रूप में ही उपयोगी है। आप निश्चित रूप से सही हैं कि यह आश्चर्यजनक है कि यह किस तरह से काम करता है, और यह एक उद्देश्य के लिए भी उद्देश्य-विशिष्ट है - जो मुझे लगता है कि इसे पायथन 3 से क्यों हटा दिया गया है।

7

पायथन इनपुट फ़ंक्शन एक ऑब्जेक्ट देता है अभिव्यक्ति का मूल्यांकन करने के परिणाम । raw_input समारोह एक स्ट्रिंग रिटर्न कि चलने के

name = "Arthur" 
age = 45 

first = raw_input("Please enter your age ") 
second = input("Please enter your age again ") 

# first will always contain a string 

# second could contain any object and you can even 
# type in a calculation and use "name" and "age" as 
# you enter it at run time ... 

print "You said you are",first 
print "Then you said you are",second 

उदाहरण:

उदाहरण: 1

Prompt$ python yraw 
Please enter your age 45 
Please enter your age again 45 
You said you are 45 Then you said you are 45 

उदाहरण: 2

Prompt$ python yraw 
Please enter your age 45 + 7 
Please enter your age again 45 + 7 
You said you are 45 + 7 Then you said you are 52 
Prompt$ 

प्र क्यों इनपुट करता है फ़ंक्शन कॉल eval?

ए परिदृश्य में जहाँ उपयोगकर्ता इनपुट में एक अभिव्यक्ति '45 + 7 'आदानों पर विचार करें, इनपुट सही परिणाम दे देंगे के रूप में अजगर 2.x में raw_input की तुलना में

+1

वैकल्पिक रूप से वे 'छोड़ें()' दर्ज कर सकते हैं जो कि खतरनाक है यदि आप कोड के एक महत्वपूर्ण खंड के माध्यम से भाग लेते हैं ... – tobyodavies

+8

या वे '__import __ ('os') इनपुट कर सकते हैं। ('Precious_file') को हटाएं बल्कि खतरनाक * कहीं भी *। ['ast.literal_eval (raw_input())'] (http://docs.python.org/library/ast.html#ast.literal_eval) व्यावहारिक रूप से सभी स्थितियों में एक बेहतर विकल्प है। कोई आश्चर्य नहीं [पायथन 3 का इनपुट()] (http://docs.python.org/py3k/library/functions.html#input) 2 के raw_input() की तरह काम करता है। –

+7

मैं इस उत्तर से असहमत हूं। इनपुट 52 के लिए "सही परिणाम" क्यों मानते हैं? मैं सही परिणाम "कृपया एक नंबर दर्ज करें" पर विचार करूंगा। ऐसे प्रोग्राम के लिए कोई अच्छा कारण नहीं है जो उपयोगकर्ता द्वारा दी गई पाइथन अभिव्यक्ति के परिणाम की गणना करने के लिए एक संख्या मांगे। पेट्रो ने बताया कि यह बेतुका व्यवहार ही नहीं बल्कि एक गंभीर सुरक्षा जोखिम भी है। सवाल "इनपुट उपयोगी है" और जवाब "नहीं" था। – mgiuca

1

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

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

संबंधित मुद्दे