python的exec、eval使用分析
簡介
python 動(dòng)態(tài)執(zhí)行字符串代碼片段(也可以是文件), 一般會(huì)用到exec,eval。
exec
exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]
注意:exec 是一個(gè)語法聲明,不是一個(gè)函數(shù).也就是說和if,for一樣.
官方文檔對(duì)于exec的解釋
This statement supports dynamic execution of Python code.
exec的第一個(gè)表達(dá)式可以是:
1.代碼字符串
2.文件對(duì)象
3.代碼對(duì)象
4.tuple
前面三種情況差不多,第四種比較特殊最后講
如果忽略后面的可選表達(dá)式,exec后面代碼將在當(dāng)前域執(zhí)行
>>> a=2 >>> exec "a=1" >>> a >>>
如果在表達(dá)式之后使用in選項(xiàng)指定一個(gè)dic,它將作為global和local變量作用域
>>> a=10 >>> b=20 >>> g={'a':6,'b':8} >>> exec "global a;print a,b" in g >>>
如果in后詳指定兩個(gè)表達(dá)式,它們將分別用作global和local變量作用域
>>> a=10 >>> b=20 >>> c=20 >>> g={'a':6,'b':8} >>> l={'b':9,'c':10} >>> exec "global a;print a,b,c" in g,l >>>
現(xiàn)在說下tuple的情況,這也是導(dǎo)致很多人誤以為exec是一個(gè)函數(shù)的原因。
如果第一個(gè)表達(dá)式是tuple
exec(expr, globals) #它等效與 exec expr in globals exec(expr, globals, locals) #它等效與 exec expr in globals,locals
eval
eval通常用來執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。
eval(expression[, globals[, locals]])
有三個(gè)參數(shù),表達(dá)式字符串,globals變量作用域,locals變量作用域。 其中第二個(gè)和第三個(gè)參數(shù)是可選的。
如果忽略后面兩個(gè)參數(shù),則eval在當(dāng)前作用域執(zhí)行。
>>> a=1 >>> eval("a+1") >>>
如果指定globals參數(shù)
>>> a=1 >>> g={'a':10} >>> eval("a+1",g) >>>
如果指定locals參數(shù)
>>> a=10 >>> b=20 >>> c=20 >>> g={'a':6,'b':8} >>> l={'b':9,'c':10} >>> eval("a+b+c",g,l) >>>
如果要嚴(yán)格限制eval執(zhí)行,可以設(shè)置globals為__builtins__,這樣 這個(gè)表達(dá)式只可以訪問__builtin__ module。
總結(jié)
exec,eval給我?guī)砹藰O大的靈活性,同時(shí)也帶來了隱含的危險(xiǎn)性, 當(dāng)我們使用它們的時(shí)候應(yīng)該總是記得詳細(xì)指定其執(zhí)行的作用域。
以上就是本文關(guān)于python的exec、eval使用分析的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Python中eval帶來的潛在風(fēng)險(xiǎn)代碼分析
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Python字典刪除鍵值對(duì)和元素的四種方法(小結(jié))
刪除列表或者字符串元素的方法不止一種,同樣,刪除字典元素的方法也不止一種,本文主要介紹python中刪除字典元素的四種方法:1、使用del語句;2、使用clear();3、使用pop();4、使用popitem()。感興趣的可以了解一下2021-12-12Django使用Celery異步任務(wù)隊(duì)列的使用
這篇文章主要介紹了Django使用Celery異步任務(wù)隊(duì)列的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Python基于pyCUDA實(shí)現(xiàn)GPU加速并行計(jì)算功能入門教程
這篇文章主要介紹了Python基于pyCUDA實(shí)現(xiàn)GPU加速并行計(jì)算功能,結(jié)合實(shí)例形式分析了Python使用pyCUDA進(jìn)行GPU加速并行計(jì)算的原理與相關(guān)實(shí)現(xiàn)操作技巧,需要的朋友可以參考下2018-06-06python內(nèi)置函數(shù)map/filter/reduce詳解
在Python中,map(), filter(), 和 reduce() 是內(nèi)置的高級(jí)函數(shù)(實(shí)際是class),用于處理可迭代對(duì)象(如列表、元組等)的元素,這篇文章主要介紹了python內(nèi)置函數(shù)map/filter/reduce的相關(guān)知識(shí),需要的朋友可以參考下2024-05-05Python實(shí)現(xiàn)向服務(wù)器請(qǐng)求壓縮數(shù)據(jù)及解壓縮數(shù)據(jù)的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)向服務(wù)器請(qǐng)求壓縮數(shù)據(jù)及解壓縮數(shù)據(jù)的方法,涉及Python文件傳輸及zip文件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06安裝pytorch報(bào)錯(cuò)torch.cuda.is_available()=false問題的解決過程
最近想用pytorch,因此裝了pytorch,但是碰到了問題,下面這篇文章主要給大家介紹了關(guān)于安裝pytorch報(bào)錯(cuò)torch.cuda.is_available()=false問題的解決過程,需要的朋友可以參考下2022-05-05Python-Tkinter Text輸入內(nèi)容在界面顯示的實(shí)例
今天小編就為大家分享一篇Python-Tkinter Text輸入內(nèi)容在界面顯示的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python實(shí)現(xiàn)光速定位并提取兩個(gè)文件的不同之處
如果你經(jīng)常與Excel或Word打交道,那么從兩份表格/文檔中找到不一樣的元素是一件讓人很頭疼的工作。本文就將以兩份真實(shí)的Excel/Word文件為例,講解如何使用Python光速對(duì)比并提取文件中的不同之處2022-08-08