-
函數(shù)定義:
eval(expression,globals=None,locals=None)
將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果。globals和locals參數(shù)是可選的,如果提供了globals參數(shù)火诸,那么它必須是dict類(lèi)型倾剿;如果提供了locals參數(shù)肮街,那么它可以是任意的map對(duì)象。
python的全局名字空間存儲(chǔ)在globals()的dict對(duì)象中;局部名字空間存儲(chǔ)在一個(gè)叫l(wèi)ocals()的dict對(duì)象中夭谤,print(locals())來(lái)查看該函數(shù)體內(nèi)的所有變量名和變量值。
-
Python版本兼容
Python2.7
Python3.x
-
eval()主要作用:
1)在編譯語(yǔ)言里要?jiǎng)討B(tài)地產(chǎn)生代碼巫糙,基本上是不可能的朗儒,但是動(dòng)態(tài)語(yǔ)言是可以的,意味著軟件已經(jīng)部署到服務(wù)器上了参淹,但只要做很少的更改采蚀,只好直接修改這部分代碼,就可以立即實(shí)現(xiàn)變化承二,不需要整個(gè)軟件進(jìn)行重新加載。
2)在在machin learning里根據(jù)用戶(hù)使用這個(gè)軟件頻率纲爸,以及方式亥鸠,可動(dòng)態(tài)地修改代碼,適應(yīng)用戶(hù)的變化识啦。
-
例子1:
a=1
g={'a':20}
eval("a+1",g)
結(jié)果:
-
例子2负蚊, 測(cè)試globals, locals
x = 1
y = 1
num1 = eval("x+y")
print (num1)
def g():
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()參數(shù)伤极,那么首先應(yīng)當(dāng)找全局的x和y值,也就是都為1姨伤,那么顯而易見(jiàn)哨坪,num2的值也是2。如果注釋掉該句乍楚,執(zhí)行下面一句呢当编?根據(jù)第3)點(diǎn)可知,結(jié)果為4
-
安全問(wèn)題:
因?yàn)閑val的特型徒溪, 很可能被黑客利用忿偷,造成安全問(wèn)題。
怎么避免安全問(wèn)題臊泌?
1鲤桥、自行寫(xiě)檢查函數(shù);
2缺虐、使用ast.literal_eval代替