(इससे पहले कि आप उत्पादन में इस तरह कोड डाल अंत में डिफ़ॉल्ट सुरक्षा चेतावनी मिलते हैं!)
अन्य उत्तर exec
और eval
के बीच अंतर समझाने का एक अच्छा काम करते हैं।
फिर भी, मैं अपने आप को x=1; y=2; x+y
तरह इनपुट लेने के लिए बल लोग लिखने के बजाय चाहने पाया: समारोह की इस तरह के निर्माण के लिए कोड की
def f():
x = 1
y = 2
return x + y
स्ट्रिंग हेरफेर एक जोखिम भरा काम है।
मैं निम्नलिखित दृष्टिकोण का उपयोग कर समाप्त हो गया:
def multiline_eval(expr, context):
"Evaluate several lines of input, returning the result of the last line"
tree = ast.parse(expr)
eval_expr = ast.Expression(tree.body[-1].value)
exec_expr = ast.Module(tree.body[:-1])
exec(compile(exec_expr, 'file', 'exec'), context)
return eval(compile(eval_expr, 'file', 'eval'), context)
यह अजगर कोड को पार्स करता है; अंतिम पंक्ति के अलावा सब कुछ के एक अस्थिर पुनर्निर्माण के लिए अस्थ पुस्तकालय का उपयोग करता है; और आखिरी पंक्ति, पूर्व को निष्पादित करने और बाद में eval'ing।
सुरक्षा चेतावनी
यह अनिवार्य सुरक्षा चेतावनी आप eval
को संलग्न करने के लिए होता है। Eval
'आईएनजी और exec
' गैर-विशेषाधिकार प्राप्त उपयोगकर्ता द्वारा प्रदान किया गया आईएनजी कोड निश्चित रूप से असुरक्षित है। इन मामलों में आप किसी अन्य दृष्टिकोण का उपयोग करना पसंद कर सकते हैं, या ast.literal_eval पर विचार कर सकते हैं। eval
और exec
खराब विचार हैं जब तक कि आप वास्तव में अपने उपयोगकर्ता को पाइथन की पूर्ण अभिव्यक्ति शक्ति नहीं देना चाहते हैं।
स्रोत
2017-01-04 20:25:29
ओह। आपका जवाब यहाँ था! इसे डुप्ली के रूप में चिह्नित किया जाना चाहिए था: पी –
lol मैं इसके बारे में सब भूल गया: पी –
मैंने इसे http: // stackoverflow से पकड़ा।कॉम/प्रश्न/30671563/eval-not-working-on-multi-line-string # comment49405263_30671563: डी –