使用exec 和 eval 執行和求值字串

2021-08-03 15:23:13 字數 1041 閱讀 8191

1.exec

執行乙個字串的語句是exec:

>>> 

exec

"print 'hello world'"

但是,使用簡單形式的exec語句絕不是好事,很多情況下可以給他提供命名空間-可以放置變數的地方,你想這樣做,從而使**不會干擾命名空間,比如下面**中使用的名稱sqrt:

from math import sqrt

exec("sqrt = 4")

sqrt(4)

traceback (most recent call last):

file "c:\users\administrator\eclipse-workspace\web_authentication\shellexec.py", line

3, in

sqrt(4)

typeerror: 'int' object is not callable

exec 語句最有用的地方在可以動態的建立**字串,如果字串是從其他地方獲得的–很有可能是使用者—那麼幾乎不能確定其他到底包含什麼**,所以為了安全起見可以增加乙個字典,起命名空間的作用。

可以通過增加in來實現,其中就是起到放置**字串命名空間作用的字典。

from math import sqrt

scope={}

exec('sqrt=1',scope)

sqrt(4)

2.0scope['sqrt']

1

潛在的破壞性**並不是覆蓋sqrt函式,原來的函式能正常工作,而通過exec 賦值的變數sqrt只在它的作用域內有效。

注意,如果需要將scope列印出來的話,會看到其他有用的東西,因為內建的builtins 字典自動包含所有內建函式和值:

scope['sqrt']

1len(scope)

2scope.keys()

dict_keys(['__builtins__', 'sqrt'])

Python中的exec和eval函式

函式exec將字串作為 執行 exec print hello,world hello,world 然而,呼叫函式exec時只給它提供乙個引數絕非好事。大多數情況下,還應向它傳遞乙個命名空間 用於放置變數的地方 否則 將汙染你的命名空間,即修改你的變數。例如,假設 使用了名稱sqrt,結果將如何呢?...

執行順序和eval

1 將命令切割成token 是以固定的一支煙meta字元分割的,有空格 製表符 換行符 與 token 的種類暴扣單詞,關鍵字 輸出入重定向 以及分號 2 檢查每個命令的第乙個token,看看是否他是不帶引號或者反斜槓的關鍵字,如果他是乙個開發的關鍵字,則這個命令其實是乙個復合命令 3 將每個命令的...

python3中的eval和exec的區別與聯絡

看了很多網上的方法,寫入檔案後開啟檔案看確實不再是亂碼,但是從檔案中讀入json時發現了亂碼,可能是讀檔案預設的編碼格式不對。下面讀寫方法可行。注意,ensure ascii false可以保證不會以ascii格式編碼,保證中文的正常轉換 import js程式設計客棧on with open te...