替代python exec函数

时间:2016-03-13 07:20:05

标签: python loops expression exec

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

这是一个伪代码

#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) 

1 个答案:

答案 0 :(得分:0)

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

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

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

在版本2.4中更改:以前本地人必须是字典。

使用全局和本地字典作为全局和本地命名空间,将表达式参数解析并计算为Python表达式(技术上讲,条件列表)。如果全局字典存在且缺少“ builtins ”,则在解析表达式之前,会将当前全局变量复制到全局变量中。这意味着表达式通常具有对标准内置模块的完全访问权限,并且传播受限制的环境。如果省略locals字典,则默认为globals字典。如果省略两个字典,则表达式在调用eval()的环境中执行。返回值是计算表达式的结果。语法错误报告为异常。例如:

serverfault.com

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

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

请参阅ast.literal_eval()以获取可以安全地评估包含仅包含文字的表达式的字符串的函数。 有关评估访问的更多信息 - https://msdn.microsoft.com/en-us/library/system.diagnostics.process.close(v=vs.110).aspx