Python`eval`:";无效语法";尝试以编程方式创建类属性时出错?
我有很多想要创建的类属性,所以我决定使用函数来创建:Python`eval`:";无效语法";尝试以编程方式创建类属性时出错?,python,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.' + labe
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
会引发此错误?您希望执行exec
而不是eval
exec('self.' + label + '_index = ' + str(index))
eval
将对表达式求值,而不是按您想要的方式运行它把
eval
想象成if
语句的参数
另外,如果您想设置类的属性,那么一定要使用setattr
事实上,99%的时间里,有更好的选择来满足您的需求,而不是使用
exec
您想要执行exec
而不是eval
exec('self.' + label + '_index = ' + str(index))
eval
将对表达式求值,而不是按您想要的方式运行它把
eval
想象成if
语句的参数
另外,如果您想设置类的属性,那么一定要使用setattr
事实上,99%的时间里,有更好的选择来满足您的需求,而不是使用
exec
试试这个:
setattr(self, name + "_index", index)
Eval对表达式求值。与C不同,在Python中,赋值是一个语句,而不是一个表达式(例如,您不能编写C=(a=b)=None
。变量a=b=3
有点特殊的语法。它实际上不传递赋值给b的值,而是传递右边的值(是的,这是一个微妙但重要的区别)
如果只是为了索引,那么可能会有更好的版本不使用名称空间。试试这个:
setattr(self, name + "_index", index)
Eval对表达式求值。与C不同,在Python中,赋值是一个语句,而不是一个表达式(例如,您不能编写C=(a=b)=None
。变量a=b=3
有点特殊语法。它实际上不传递分配给b的值,而是传递右侧的值(是的,这是一个微妙但重要的区别)
如果只是为了索引,可能会有更好的版本不使用名称空间。使用exec
表示“命令”(如x=5
),使用eval
表示表达式(如2**5
)。是的,使用setattr
肯定更好。使用exec
表示“命令”(如x=5
)和表达式的eval
(如2**5
)。是的,使用setattr
肯定更好。