Python使用eval函数执行动态标表达式过程详解
英文文档:
eval(expression,globals=None,locals=None)
Theargumentsareastringandoptionalglobalsandlocals.Ifprovided,globalsmustbeadictionary.Ifprovided,localscanbeanymappingobject.
TheexpressionargumentisparsedandevaluatedasaPythonexpression(technicallyspeaking,aconditionlist)usingtheglobalsandlocalsdictionariesasglobalandlocalnamespace.Iftheglobalsdictionaryispresentandlacks‘__builtins__',thecurrentglobalsarecopiedintoglobalsbeforeexpressionisparsed.Thismeansthatexpressionnormallyhasfullaccesstothestandardbuiltinsmoduleandrestrictedenvironmentsarepropagated.Ifthelocalsdictionaryisomitteditdefaultstotheglobalsdictionary.Ifbothdictionariesareomitted,theexpressionisexecutedintheenvironmentwhereeval()iscalled.Thereturnvalueistheresultoftheevaluatedexpression.Syntaxerrorsarereportedasexceptions.Example:
>>>x=1
>>>eval('x+1')
2
Thisfunctioncanalsobeusedtoexecutearbitrarycodeobjects(suchasthosecreatedbycompile()).Inthiscasepassacodeobjectinsteadofastring.Ifthecodeobjecthasbeencompiledwith'exec'asthemodeargument,eval()‘sreturnvaluewillbeNone.
Hints:dynamicexecutionofstatementsissupportedbytheexec()function.Theglobals()andlocals()functionsreturnsthecurrentglobalandlocaldictionary,respectively,whichmaybeusefultopassaroundforusebyeval()orexec().
Seeast.literal_eval()forafunctionthatcansafelyevaluatestringswithexpressionscontainingonlyliterals.
执行动态标表达式求值
说明:
1.执行动态语句,返回语句执行的值。
>>>eval('1+2+3+4')
10
2.第一个参数为语句字符串,globals参数和locals参数为可选参数,如果提供,globals参数必需是字典,locals参数为mapping对象。
3.globals参数用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量。
>>>g={'num':2} >>>eval('num+2')#num未定义 Traceback(mostrecentcalllast): File"",line1,in eval('num+2') File" ",line1,in NameError:name'num'isnotdefined >>>eval('num+2',g)#g中有定义num,可执行 4
4.locals参数用来指定代码执行时可以使用的局部变量以及收集代码执行后的局部变量
>>>g={'num1':2} >>>l={'num2':4} >>>eval('num1+num2',g,l) 6
5.为了保证代码成功运行,globals参数字典不包含__builtins__这个key时,Python会自动添加一个key为__builtins__,value为builtins模块的引用。如果确实要限制代码不使用builtins模块,需要在global添加一个key为__builtins__,value为{}的项即可(很少有人这么干吧)。
>>>g={} >>>eval('abs(-1)',g) 1 >>>g={'__builtins__':{}} >>>eval('abs(-1)',g)#不能使用内置函数了 Traceback(mostrecentcalllast): File"",line1,in eval('abs(-1)',g) File" ",line1,in NameError:name'abs'isnotdefined
6.当globals参数不提供是,Python默认使用globals()函数返回的字典去调用。当locals参数不提供时,默认使用globals参数去调用。
>>>num=1 >>>eval('num+2') 3 >>>globals()#返回字典中含有num的key {'__doc__':None,'num':1,'__package__':None,'__name__':'__main__','__loader__':,'__spec__':None,'__builtins__': } >>>eval('num+2',{})#locals参数未提供,locals参数=globals参数 Traceback(mostrecentcalllast): File" ",line1,in eval('num+2',{}) File" ",line1,in NameError:name'num'isnotdefined >>>l=locals() >>>eval('num+2',{},l)#locals参数含有num的key,能求值 3 >>>locals() {'__doc__':None,'l':{...},'num':1,'__package__':None,'__name__':'__main__','__loader__': ,'__spec__':None,'__builtins__': } >>>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。