2011-06-20 17 views
7

मैं निम्नलिखित कोड, eval फ़ंक्शन का उपयोग करता है जो:eval देने सिंटेक्स त्रुटि

lines = self.fulltext.splitlines() 

CURRENT = 0 

extractors = { "solar zenith angle" : (CURRENT, 1, "self.solar_z"), 
         "ground pressure" : (CURRENT, 2, "self.ground_pressure")      

      } 

print locals() 

for line in lines: 
    for label, details in extractors.iteritems(): 
     if label in line: 
      if details[0] == CURRENT: 
       values = line.split() 
       eval("%s = values[%d]" % (details[2], details[1])) 

हालांकि, जब मैं इसे चलाने मैं निम्नलिखित त्रुटि मिलती है:

eval("%s = values[%d]" % (details[2], details[1])) 
    File "<string>", line 1 
    self.solar_z = values[1] 
       ^
SyntaxError: invalid syntax 

ऐसा क्यों है? self.solar_z परिभाषित किया गया है, और बयान जो eval'd है सही दिखता है।

+3

यह एक बुरा विचार है। यदि आपको तारों द्वारा मूल्यों को स्टोर करने की आवश्यकता है, तो 'dict' का उपयोग करें, गतिशील रूप से चर बनाने के लिए नहीं। यह कम से कम सरल है, * आपके * गुंजाइश के साथ पेंच नहीं करता है, संभावित सुरक्षा जोखिमों को जोड़ने की ज़रूरत नहीं है, तोड़ने के लिए बहुत कठिन है (उदाहरण के लिए, यह संभवतः सिंटैक्स त्रुटि उत्पन्न नहीं कर सकता) बेहतर प्रदर्शन करता है। - यह बस बेहतर है, और उस पर एक बड़े magin द्वारा। (और इसमें कार्यात्मक प्रोग्रामिंग के साथ कुछ लेना देना नहीं है।) – delnan

+0

@ डेलनान: कारण यह है कि मैं इस तरह के चर का उपयोग कर रहा हूं कि मैं वर्ग के उपयोगकर्ताओं को कक्षा के रूप में चर के रूप में उपयोग करने की अनुमति देना चाहता हूं। class.dict ['variablename'] करें। – robintw

+6

आप कक्षा में '__getattr__' विधि जोड़कर ऐसा कर सकते हैं। –

उत्तर

10

इसके बजाय exec का उपयोग करें, यह कथन का मूल्यांकन करता है।

exec "self.solar_z = values[1]" in locals(), locals()

7

eval() अभिव्यक्तियों का मूल्यांकन करता है। पायथन में असाइनमेंट एक बयान है। यह काम नहीं करेगा।

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