如何在python中编写这个eval?

时间:2014-12-29 03:51:49

标签: python eval

我希望使用给定列表评估以下dict y1~y10[name]

我知道使用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)

3 个答案:

答案 0 :(得分:6)

使用内省和c来处理平凡任务的诱惑是一种强烈的代码气味,这表明需要重新思考你的方法 - 在这里,正如其他人所提到的那样,使self.y成为dicts的列表很多更好的主意。不过,您还需要在代码中使用其他修复程序。

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) - 这在编程中不可避免地要简单得多,而且简单是我不想要的如此宝贵的美德放弃......

答案 1 :(得分:4)

eval执行时无需使用getattr

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

但是把你的y#放在一个列表中会更好。这样你就可以做到:

self.y[i][name] = value

答案 2 :(得分:0)

我不喜欢使用eval而不是Kevin或Dan D.,但要回答你的问题,你可以使用:

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

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

您还可以将这两个语句粘合在一起并消除yi局部变量:

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

然而,就像其他人所说的那样,这不是最好的方法。字典,列表甚至字典元组都可以更好地完成工作。 (参见Alex Martelli的例子。)