2014-12-29 22 views
0

我想用给定的列表来估价以下dicty1~y10[name]如何在python中编写这个eval?

我知道使用eval(self.y$i[name]) = value是错误的,但我应该如何在python中执行此操作?

class excel: 
    def __init__(self): 
     self.base_year = 2004 
     self.y1 = {'year':self.base_year} 
     self.y2 = {'year':self.base_year + 1} 
     self.y3 = {'year':self.base_year + 2} 
     self.y4 = {'year':self.base_year + 3} 
     self.y5 = {'year':self.base_year + 4} 
     self.y6 = {'year':self.base_year + 5} 
     self.y7 = {'year':self.base_year + 6} 
     self.y8 = {'year':self.base_year + 7} 
     self.y9 = {'year':self.base_year + 8} 
     self.y10 = {'year':self.base_year + 9} 
    def value(self, name, value_list): 
     for value, i in value_list, range(1, 10): 
      eval(self.y$i[name]) = value 

list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ] 
e1.value('test', list) 
+6

为什么不直接创建一个名为'self.y'的列表或字典?那么你首先不需要'eval()'或类似的东西。 – Kevin

+0

请勿使用eval()。 – GLHF

回答

6

诱惑使用内省&下平凡的任务是一个强大的代码味道这表明重新考虑你的方法 - 在这里,正如其他人所说,使得self.ydicts列表是更好的主意。不过,您还需要在代码中进行其他修复。

class excel: 
    def __init__(self): 
     self.base_year = 2004 
     self.y = [{'year':self.base_year+i} for i in range(10)] 
    def value(self, name, value_list): 
     for i, value in enumerate(value_list): 
      self.y[i][name] = value 

是的,这是self.y基0(进入0-9) - 这是不可避免的编程更简单了很多,简单是如此珍贵的美德,我不会想放弃......

+0

谢谢你,你的代码优雅地解决了我的问题。 – user1726366

4

无需使用evalgetattr会做:

getattr(self, 'y%u' % i)[name] = value 

但它会更好地把你的Y#S IN的列表。所以,你可以这样做:

self.y[i][name] = value 
0

我不喜欢使用eval这个比凯文或丹D.任何更多的事,但要回答你的问题,你可以使用:

yi = eval("self.y{0}".format(i)) 
yi[name] = value; 

的eval()函数计算表达式,但带有=,+ =等的赋值不是Python中的表达式。这是一个声明。因此,我使用eval()将字典引用转换为局部变量(y),并使用该引用来设置它引用的字典的成员。

您也可以粘上这两个语句在一起,消除了易局部变量:

eval("self.y{0}".format(i))[name] = value; 

但是,像其他人所说,这是不是要做到这一点的最好办法。字典,列表甚至字典的元组都能更好地完成这项工作。 (请参阅Alex Martelli的示例。)

+0

谢谢@Dan D.指出我的旧方法很糟糕,仍然给出了答案。你们是伟大的。再次感谢。 – user1726366