python exec 函数的替代方法

Alternative to python exec function

我有一个简单的用例,我需要打印表达式并执行它们 自动地。我看到一些帖子建议避免这种情况,因为有几个更好的选择。在这种情况下,我无法决定替代方案。 这就是问题所在。我有一个元素列表,我正在尝试 1.iterate 每个元素 2.print 一个表达式 3.execute 表达式

这是一个伪代码

#Define the dataset

import pandas as pd
df_scr_crd = {'Subject': ['MATH', 'MATH', 'MATH', 'MATH', 'PSY', 'PSY', 'PSY', 'PSY'], 
        'SCR_STRT': [10, 20, 30, 99999, 'A', 'B', 'C', 'D'], 
        'POINTS': [100, 200, 300, 500, 10, 20, 30, 40]}
df_scr_crd_d = pd.DataFrame(df_scr_crd, columns = ['Subject', 'SCR_STRT', 'POINTS'])

df_scr_cns = {'Subject': ['MATH', 'PSY'], 
        'CNS': ['min', 'max']}
df_scr_cns_d = pd.DataFrame(df_scr_cns, columns = ['Subject', 'CNS'])

df_scr_crd_d

#Define and Iterate over the list

list = ['MATH', 'PSY']
for i in list:
    print "{0}_bin".format(i)
    print "{0}_bin = df_scr_crd_d.loc[df_scr_crd_d.Subject == '{0}', 'POINTS'].tolist()".format(i)
    exec "{0}_bin = df_scr_crd_d.loc[df_scr_crd_d.Subject == '{0}', 'POINTS'].tolist()".format(i) 

如果你不想使用exec,那么你可以使用eval(),它被描述为,

eval(expression[, globals[, locals]])

参数是 Unicode 或 Latin-1 编码的字符串以及可选的全局变量和局部变量。如果提供,globals 必须是字典。如果提供,locals 可以是任何映射对象。

在 2.4 版中更改:以前 locals 必须是字典。

表达式参数被解析并评估为 Python 表达式(从技术上讲,条件列表),使用全局和局部字典作为全局和局部名称空间。如果全局字典存在并且缺少'builtins',则在解析表达式之前将当前全局变量复制到全局变量中。这意味着表达式通常可以完全访问标准 builtin 模块,并且传播受限环境。如果省略局部字典,则默认为全局字典。如果两个字典都被省略,表达式将在调用 eval() 的环境中执行。 return 值是计算表达式的结果。语法错误被报告为异常。示例:

>>> x = 1
>>> print eval('x+1')
2

该函数也可用于执行任意代码对象(例如由 compile() 创建的代码对象)。在这种情况下,传递代码对象而不是字符串。如果代码对象是使用 'exec' 作为模式参数编译的,则 eval() 的 return 值将为 None.

提示:exec语句支持语句的动态执行。 execfile() 函数支持从文件执行语句。 globals() 和 locals() 函数 return 分别是当前的全局和本地字典,传递给 eval() 或 execfile() 使用可能很有用。

请参阅 ast.literal_eval() 以了解可以使用仅包含文字的表达式安全地评估字符串的函数。 有关 eval 的更多信息,请访问 - Python Docs