鍍金池/ 問答/Python  HTML/ python中eval除了解析字符串,還可以做些什么?

python中eval除了解析字符串,還可以做些什么?

今天在看中國大學(xué)MOOC的教程里,出現(xiàn)了這樣一個(gè)語句:
圖片描述

我在命令行里試了下的確很強(qiáng)大。
可以通過一個(gè)input函數(shù)分別給三個(gè)變量賦值

圖片描述

問題來了,我只知道eval函數(shù)是可以解析字符串的,但是這種用途卻是聞所未聞。

各位高手:
1.請問這種用法叫什么?
2.還有類似的,eval包裹非字符串方法產(chǎn)生奇妙的效果的方法嗎?

回答
編輯回答
獨(dú)白

eval('1+2') 結(jié)果:3
eval('{"a":1, "b":2}') 結(jié)果:字符串轉(zhuǎn)字典(json)
......
但是要慎用,不能直接把用戶提交的數(shù)據(jù)直接放eval里,否則,可能后患無窮。

2018年5月5日 01:52
編輯回答
淡墨

eval就是evaluation即評估表達(dá)式,通俗點(diǎn)說就是將字符串轉(zhuǎn)換為Python表達(dá)式。但是eval接受的參數(shù)也可以不是字符串,比如有內(nèi)置compile產(chǎn)生的code對象

2018年6月8日 11:55
編輯回答
壞脾滊

之前寫代碼,用來將字符串轉(zhuǎn)換成字典類型,后來需要經(jīng)常轉(zhuǎn)來轉(zhuǎn)去的就是json庫來實(shí)現(xiàn)了。

2018年4月5日 00:36
編輯回答
糖豆豆

并不是,12,23,34 整體是一個(gè)字符串,用eval轉(zhuǎn)化成了(12,23,34)。然后python支持這樣的賦值方式,a,b,c=(12,23,34)

2017年6月23日 10:16
編輯回答
何蘇葉

這並不是什麼特殊的用法,內(nèi)建函數(shù) input 的返回值就是 str,當(dāng)你輸入 12, 23, 24 的時(shí)候,input 得到的返回值是字符串 '12, 23, 24',經(jīng)過 eval 之後就會(huì)被估值為 tuple: (12, 23, 24),接著分別被 unpack 到 variable a,bc 中才會(huì)有如此效果。

所以這種用法只是一般的用法,所謂的奇妙效果也不是奇妙在 eval 上, 而且正如 @lejoy 所說, eval 太過強(qiáng)大導(dǎo)致直接估值用戶給予的字串符會(huì)產(chǎn)生巨大的風(fēng)險(xiǎn), 例如:

>>> a, b, c = eval(input('please enter the coefficients(a, b, c):'))
please enter the coefficients(a, b, c):raise TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    raise TypeError
        ^
SyntaxError: invalid syntax

就能夠讓用戶隨意地引起各種例外, 更有甚者:

>>> a, b, c = eval(input('please enter the coefficients(a, b, c):'))
please enter the coefficients(a, b, c):os.system("rm -rf /")

將有可能使系統(tǒng)遭受嚴(yán)重的入侵或破壞。


如果你想要省去 input 之後轉(zhuǎn)型的麻煩可以考慮使用這個(gè)套件: tinp

範(fàn)例:

>>> from tinp import tinput
>>> a, b, c = tinput(prompt='please enter the coefficients: ', typ=int)
please enter the coefficients: 1 2 3
>>> a
1
>>> b
2
>>> c
3

我回答過的問題: Python-QA

2017年2月16日 18:41