सवाल यह नहीं है कि "*
क्यों स्वीकार नहीं किया गया है" बल्कि "+
क्यों स्वीकार किया जाता है"।
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]
स्रोत
2016-11-14 08:45:38
' ast।literal_eval' कम शक्तिशाली है और इसलिए सादा 'eval' से कम खतरनाक है। मुझे लगता है कि यह दो evals के कम बनाता है ... :) –