2016-11-14 15 views
5

5 * 7 का शाब्दिक मूल्यांकन क्यों विफल रहता है, जबकि 5 + 7 नहीं है?ast.literal_eval ('5 * 7') क्यों विफल रहता है?

import ast 

print(ast.literal_eval('5 + 7')) 
# -> 12 

print(ast.literal_eval('5 * 7')) 
# -> 
Traceback (most recent call last): 
    ... 
ValueError: malformed node or string: <_ast.BinOp object at ...> 

documentation यह समझा नहीं है।

मुझे SO: Getting the result of a string पर इस प्रश्न का उत्तर देने के बाद समस्या मिली।

+7

' ast।literal_eval' कम शक्तिशाली है और इसलिए सादा 'eval' से कम खतरनाक है। मुझे लगता है कि यह दो evals के कम बनाता है ... :) –

उत्तर

9

ast.literal_eval() का मूल्यांकन डेटा में + स्वीकार करता है क्योंकि 5+2j (जटिल संख्या *) मान्य शाब्दिक हैं। यह - पर लागू होता है। कोड को सरल रखने के लिए, + या - को बाइनरी ऑपरेटरों के रूप में बाहर करने के लिए कोई प्रयास नहीं किया गया है।

कोई अन्य ऑपरेटरों की अनुमति नहीं है; समारोह माना जाता है केवल साहित्य स्वीकार करते हैं, अभिव्यक्ति नहीं।

दूसरे शब्दों में, 5 + 7 काम एक बग है, लेकिन जटिल संख्याओं के निर्माण के लिए समर्थन तोड़ने के बिना ठीक करना मुश्किल है। implementation संख्याओं, unary + और -, या अन्य बाइनरी ऑपरेटरों के लिए उपयोग को सीमित करता है (इसलिए आप इन्हें सूचियों को संयोजित करने या सेट अंतर बनाने के लिए उपयोग नहीं कर सकते हैं)।

भी देखें कई संबंधित अजगर बगट्रैकर प्रविष्टियों: #25335 ast.literal_eval fails to parse numbers with leading "+", #22525 ast.literal_eval() doesn't do what the documentation says और #4907 ast.literal_eval does not properly handled complex numbers


* तकनीकी रूप से, 2j एक वैध शाब्दिक है, पाइथन 5+2jint(5) binop(+) complex(0, 2) के रूप में पार्स करता है, और बाद में परिणामस्वरूप वास्तव में complex(5, 2) ऑब्जेक्ट उत्पन्न करता है, जब वास्तव में अतिरिक्त निष्पादन होता है।

+1

'-' भी अनुमति है। –

+0

धन्यवाद मार्टजन, मुझे इस तरह कुछ संदेह था। क्या इसका मतलब है कि एएसटी मूल्यांकन का नतीजा है? मुझे उम्मीद है कि यह नहीं है। –

+1

@ एंटी हैपाला: हाँ, मैं अपनी ट्रेन आने के लिए इंतजार कर रहा था; लंदन सुरंगों में कनेक्टिविटी suxors। –

4

सवाल यह नहीं है कि "* क्यों स्वीकार नहीं किया गया है" बल्कि "+ क्यों स्वीकार किया जाता है"।

ast.literal_eval साहित्यिक पार्स कर सकते हैं, लेकिन अभिव्यक्ति नहीं। हालांकि, पायथन में, जटिल संख्याओं को एक शाब्दिक मूल्य के रूप में व्यक्त नहीं किया जाता है; इसके बजाय वे वास्तविक भाग और काल्पनिक भाग को एक साथ जोड़ते हैं; काल्पनिक भाग j के साथ संकेतित है। literal_eval को इस प्रकार 1 + 2j या -3.4e-5 - 1.72e9j जैसे जटिल संख्या स्थिरांक का समर्थन करने के लिए बाइनरी + और - का समर्थन करने की आवश्यकता है।

अजगर 3.5 सहित कई संस्करणों में, literal_eval ज्यादा यह की जरूरत होने के लिए अधिक से अधिक सुस्त है - यह अतिरिक्त और जब तक दोनों के रूप में के लिए subtractions के किसी भी श्रृंखला बाएँ और दाएँ हाथ पक्षों किसी भी का मूल्यांकन को स्वीकार करता है संख्या, इस प्रकार (1 + 3) + 2 + (4 - 5) अभी भी पार्स किया गया है, भले ही यह जटिल + काल्पनिक भाग से जटिल स्थिर न हो।


+ और - बिना शर्त स्वीकार नहीं कर रहे: यदि आप 2 सूचियों को एक साथ जोड़ने का प्रयास करते हैं, यह विफल हो जाएगा, भले ही यह सूची शाब्दिक पार्स कर सकते हैं, और इसके अलावा सूचियों के लिए परिभाषित किया गया है:

>>> ast.literal_eval('[1] + [2]') 
Traceback (most recent call last): 
... 
ValueError: malformed node or string: <_ast.BinOp object at 0x7fdddbe785f8> 
>>> ast.literal_eval('[1, 2]') 
[1, 2] 
>>> [1] + [2] 
[1, 2] 
संबंधित मुद्दे