Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python`eval`:";无效语法";尝试以编程方式创建类属性时出错?_Python - Fatal编程技术网

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
肯定更好。