2012-05-14 13 views
5

में एक बुलियन अभिव्यक्ति का परीक्षण करें मेरे पास एक स्ट्रिंग में एक बूलियन अभिव्यक्ति है। जैसे। । क्या इस स्ट्रिंग को पार्स और मूल्यांकन करने का कोई आसान तरीका है, इसलिए यह True (इस मामले में) वापस आ जाएगा।एक पाइथन स्ट्रिंग

ast.literal_eval("20 < 30") काम नहीं करता है।

उत्तर

2

इस उपयोगकर्ता परिभाषित स्ट्रिंग है, या एक आप को परिभाषित कर रहे हैं?

यदि यह एक स्ट्रिंग आप बना रहे है, तो आप इस्तेमाल कर सकते हैं eval (eval("20 < 30")), लेकिन अगर स्ट्रिंग उपयोगकर्ता द्वारा दिया जाता है, आपको पहले उसे साफ़ करने में ...

+2

के बारे में भूल गया मैं इसे बना देता हूं। कोई चिंता नहीं :) Eval वास्तव में एक बहुत अच्छा और बहुत बड़ा सुरक्षा छेद है। – RickyA

0

ast.literal_eval काम नहीं करना चाहिए चाहते हो सकता है चूंकि (दस्तावेज़ों से) "प्रदान की गई स्ट्रिंग या नोड में केवल निम्नलिखित पायथन शाब्दिक संरचनाएं हो सकती हैं: तार, संख्याएं, ट्यूपल्स, सूचियां, डिब्बे, बूलियन, और कोई नहीं।"। अभिव्यक्ति 20<30 को किसी प्रकार का मूल्यांकन की आवश्यकता है, इससे पहले कि bool लौटाता है।

eval, यानी eval पर जाने से पहले ऑपरेटर पर स्ट्रिंग को विभाजित करना और literal_eval एक सुरक्षित सुझाव होगा।

import ast 

expr = "20 < 30" 
operator = "<" 
lhs,rhs = map(ast.literal_eval, map(str.strip, expr.split(operator))) 
eval("%s %s %s"%(lhs,operator,rhs)) 

जब lhs,rhs का मूल्यांकन एक try, except खंड में बात रैपिंग कुछ इनपुट त्रुटियां पकड़ सकता है।

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