我有很多我想要创建的类属性,所以我决定使用一个函数来执行此操作:
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
会引发此错误?
答案 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的值,但右边的价值(是的,这是一个微妙但重要的区别)。
如果它只是一个索引,可能会有更好的版本,但不会影响命名空间。