ITPub博客

首页 > 应用开发 > IT综合 > exec 的使用

exec 的使用

原创 IT综合 作者:aquila 时间:2007-04-10 00:34:05 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 开始
下一篇: 没有了~
请登录后发表评论 登录
全部评论
  • 博文量
    2
  • 访问量
    150424

最新文章