Python中的exec怎么使用?
如何利用Python的exec进行限定环境的脚本的解释运行。
[@more@]最近因为要使用python写一个公式系统,要求能够执行客户写一些简单的公式如 a = b + c, 所以仔细研究了一下python的exec的使用方法。
exec语法:
exec_stmt ::=
"exec" expression
["in" expression ["," expression]]
实际使用中有两种使用方式:
1、使用当前的运行环境: exec(scriptString)
2、使用指定的运行环境: exec(scriptString, dict) 或者 exec scriptString in dict
上面第一种方式使用当前的运行环境locals(), 所以如果scriptString = 'a=b+c',则需要b和c都是在当前环境中有效的变量,如果没有就会报错了。
使用第二种方式调用,则需要使用另外一个参数dict,这个参数是个字典类型,其实就是exec的运行环境,同样如果scriptString='a=b+c',则需要在指定的字典dict中必须有b和c两个变量。
明白上面第二种运行方式很重要,因为我们今天主要就是利用这种运行方式的一些特点。在公式‘a=b+c'中,如果b和c都不存在,则会报错。但是如果我们能够在运行时察觉到b和c不存在,而且能够动态的构造它们,那岂不是很好?
我的解决方式就是继承类dict,并重载其 __getitem__ 方法,示例如下:
########################################################################################################
# 公式运算环境
########################################################################################################
class FormulaEnv(dict):
########################################################################################################
# 构造函数
########################################################################################################
def __init__(self):
self['func'] = self.func;
########################################################################################################
########################################################################################################
# 环境对象核心,截获所有变量的访问
########################################################################################################
def __getitem__(self, k):
if self.has_key(k):
return dict.get(self, k);
self[k] = None;
if k=='b':
self[k]=1;
elif k=='c':
self[k]=2;
return dict.get(self, k);
######################################################################################################
######################################################################################################
# 环境中定义的函数
######################################################################################################
def func(self):
print 'I Love Python!';
return;
######################################################################################################
######################################################################################################
在上面的示例中,类FormulaEnv继承dict,并重载__getitem__方法,在此方法中对所有变量的名称k进行判断,如果不存在与
当前的环境中,则构造此变量并放置于当前的环境字典中。 在__init__构造函数中,将函数func也加入到了环境对象dict中,所以在公式
中不仅可是使用类似a=b+c的公式,还可以使用函数func如:a = func('', '', None);
使用类FormulaEnv的方法参考如下:
env = FormulaEnv();
try:
code='a=b+c; func();';
exec(code, env);
except Exception,msg:
print str(msg);
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/36000/viewspace-909663/ ,如需转载,请注明出处,否则将追究法律责任。