详解python eval函数的妙用
pythoneval函数功能:将字符串str当成有效的表达式来求值并返回计算结果。
函数定义:
eval(expression,globals=None,locals=None)
将字符串str当成有效的表达式来求值并返回计算结果。globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。
python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print(locals())来查看该函数体内的所有变量名和变量值。
Python版本兼容:
- Python2.7
- Python3.x
eval()主要作用:
1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。
2)在machinlearning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。
英文解释:
Theargumentsareastringandoptionalglobalsandlocals.Ifprovided,globalsmustbeadictionary.Ifprovided,localscanbeanymappingobject.
TheexpressionargumentisparsedandevaluatedasaPythonexpression(technicallyspeaking,aconditionlist)usingtheglobalsandlocalsdictionariesasglobalandlocalnamespace.Iftheglobalsdictionaryispresentandlacks‘__builtins__',thecurrentglobalsarecopiedintoglobalsbeforeexpressionisparsed.Thismeansthatexpressionnormallyhasfullaccesstothestandardbuiltinsmoduleandrestrictedenvironmentsarepropagated.Ifthelocalsdictionaryisomitteditdefaultstotheglobalsdictionary.Ifbothdictionariesareomitted,theexpressionisexecutedintheenvironmentwhereeval()iscalled.Thereturnvalueistheresultoftheevaluatedexpression.Syntaxerrorsarereportedasexceptions.Example:
例子:
a=1 g={'a':20} eval("a+1",g)
结果:
1
例子2,测试globals,locals
x=1 y=1 num1=eval("x+y") print(num1) defg(): x=2 y=2 num3=eval("x+y") print(num3) num2=eval("x+y",globals()) #num2=eval("x+y",globals(),locals()) print(num2) g()
num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4
实例展示:
可以把list,tuple,dict和string相互转化。
################################################# 字符串转换成列表 >>>a="[[1,2],[3,4],[5,6],[7,8],[9,0]]" >>>type(a)>>>b=eval(a) >>>printb [[1,2],[3,4],[5,6],[7,8],[9,0]] >>>type(b) ################################################# 字符串转换成字典 >>>a="{1:'a',2:'b'}" >>>type(a) >>>b=eval(a) >>>printb {1:'a',2:'b'} >>>type(b) ################################################# 字符串转换成元组 >>>a="([1,2],[3,4],[5,6],[7,8],(9,0))" >>>type(a) >>>b=eval(a) >>>printb ([1,2],[3,4],[5,6],[7,8],(9,0)) >>>type(b)
安全问题:
因为eval的特型,很可能被黑客利用,造成安全问题。
怎么避免安全问题?
1、自行写检查函数;
2、使用ast.literal_eval代替
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。