简单评估

你好,
前一段时间,我在清单上问了一个简单评估的问题
功能,能够评估简单的python构建体(元组,dict,
列表,字符串,数字等)以安全的方式:http://groups.google.com/group/comphec.01273441d445f/
还指出了Fredrik Lundh:http://effbot.org/zone/simple-iterator-parser.htm的简单评估函数.他的解决方案,使用
模块令牌,简短而优雅.所以我用他的代码作为
简单评估dict,元组,列表,字符串,
Unicode字符串,整数,浮子,无,真和错误.我有
包括下面的代码以及一些基本测试,以及
分析...在我的计算机上(winxp,python 2.5),简单评估是关于
比内置评估慢5倍...
对评论,加速度,一般改进等表示赞赏.作为
这是对社区的贡献,我建议任何人
改进已发布在此线程中...
-tor Erik
代码(在2.5上测试,但应适用于版本> = 2.3):
'''
递归评估:
元组,列表,dict,字符串,Unicode字符串,ints,floats,
是的,错误,没有
'''
导入Cstringio,令牌,Itertools
关键字= {'none':none,'false':false,'true':true}
def原子(下一个,令牌):
如果令牌[1] =='('::
out = []
token = next()
while token [1]!=')':
out.append(atom(下一个,token))
token = next()
如果令牌[1] ==',':
token = next()
返回元组(OUT)
elif令牌[1] =='[':
out = []
token = next()
while token [1]!=']':
out.append(atom(下一个,token))
token = next()
如果令牌[1] ==',':
token = next()
返回
elif token [1] =='{':
out = {}
token = next()
while token [1]!='}':
key = arom(下一个,令牌)
next()#跳过键值定界符
token = next()
out [key] = arom(下一个,令牌)
token = next()
如果令牌[1] ==',':
token = next()
返回
Elif Token [1] .startswith('U'):
返回令牌[1] [2:-1] .decode('unicode-escape')
elif令牌[0]是tokenize.string:
返回令牌[1] [1:-1] .decode('String-escape')
elif令牌[0]是tokenize.number:
尝试:
返回int(token [1],0)
除valueerror:
返回float(token [1])
关键字中的elif令牌[1]:
返回关键字[token [1]]
提高语法('畸形表达式(%r)�'%令牌[1])
def simple_eval(源):
src = cstringio.stringio(source).Readline
src = tokenize.generate_tokens(src)
src = itertools.ifilter(lambda x:x [0]不是tokenize.nl,src)
res = atom(src.next,src.next())
如果src.next()[0]不tokenize.endmarker:
提高语法("表达后的虚假数据")
返回res
如果__name__ =='__ main __':
expr =(1,2.3,u'h \ xf8h \ n','h \ xc3 \ xa6',['a',1],
{'list':[],'tuple':(),'dict':{}},false,true,none)
rexpr = ret(expr)
a = simple_eval(rexpr)
b = eval(rexpr)
断言a == b
导入时间
print timeit.timer('eval(rexpr)',从__ -main __导入
rexpr').重复(数字= 1000)
print timeit.timer('simple_eval(rexpr)',从__ -main __导入
rexpr,simple_eval').重复(number = 1000)

# 回答1


En Sun,2007年11月18日22:24:39 -0300,Greg
escribi�:
....但是不幸 最慢的选择,所以不算 速度优化. 我会研究一种混合方法:使用解析器来确保 表达是"安全的",然后致电评估. - - Gabriel Genellina

标签: python

添加新评论