Python`eval`:"语法无效"错误,尝试以编程方式创建类属性?

时间:2015-05-07 22:57:25

标签: python

我有很多我想要创建的类属性,所以我决定使用一个函数来执行此操作:

def make_index_variables(self):
    for index, label in enumerate(self.variable_labels):
        eval('self.' + label + '_index = ' + str(index))

如果更早,我定义了:

self.variable_labels = ['x', 'y']

我收到如下错误消息:

eval('self.' + label + '_index = ' + str(index))

    self.x_index = 0
                     ^
    SyntaxError: invalid syntax

我开始意识到使用setattr可能比使用eval更好(但我不确定)。在任何情况下,为什么eval会引发此错误?

2 个答案:

答案 0 :(得分:4)

您希望exec代替eval

exec('self.' + label + '_index = ' + str(index))

eval将评估表达式,而不是按照您的意愿运行它。
eval视为if语句的参数。

此外,如果要设置类的属性,请务必使用setattr
实际上,99%的时间有更好的选择,而不是使用exec

答案 1 :(得分:1)

试试这个:

setattr(self, name + "_index", index)

Eval评估表达式。与C不同,在Python中,赋值是一个语句,而不是一个表达式(例如,你不能写c = (a = b) == None。变体a = b = 3有点特殊的语法。它实际上没有传递给b的值,但右边的价值(是的,这是一个微妙但重要的区别)。

如果它只是一个索引,可能会有更好的版本,但不会影响命名空间。