函式exec將字串作為**執行
exec("print('hello,world!')")
hello,world!
然而,呼叫函式exec時只給它提供乙個引數絕非好事。大多數情況下,還應向它傳遞乙個命名空間——用於放置變數的地方;否則**將汙染你的命名空間,即修改你的變數。例如,假設**使用了名稱sqrt
,結果將如何呢?
from math import sqrt
exec('sqrt = 1', scope)
sqrt(4)
輸出:
typeerror traceback (most recent call last)
in ----> 1 sqrt(4)
typeerror: 'int' object is not callable
既然如此,為何要將字串作為**執行呢?函式exec
主要用於動態地建立**字串。如果這種字串來自其他地方(可能是使用者),就幾乎無法確定它將包含什麼內容。因此為了安全起見,要提供乙個字典以充當命名空間。
from math import sqrt
scope = {}
exec('sqrt = 1', scope)
sqrt(4)
輸出:
2.0
如你所見,可能帶來破壞的**並非覆蓋函式sqrt
。函式sqrt
該怎樣還怎樣,而通過exec執行賦值語句建立的變數位於scope
中。
請注意,如果你嘗試將scope
列印出來,將發現它包含惡化你多內容,這是因為自動在其中新增了包含所有內建函式和值的字典__builtins__
。
len(scope)
輸出
2
scope.keys()
輸出
dict_keys(['__builtins__', 'sqrt'])
eval是乙個類似於exec的內建函式。exec執行一系列python語句,而eval計算用字串表示的python表示式的值,並返回結果(exec什麼都不返回,因為它本身是條語句)。例如,你可使用如下**來建立乙個python計算器:
eval(input("enter an arithmetic expression: "))
輸出
enter an arithmetic expression: 10+13**2
179
與exec一樣,也可以向eval提供乙個命名空間,雖然表示式通常不會像語句那樣給變數重新賦值。 Python中理解exec 用法
exec語句用來執行儲存在字串或檔案中的python語句。例如,我們可以在執行時生成乙個包含python 的字串,然後使用exec語句執行這些語句。下面是乙個簡單的例子。exec print hello world hello world 注意例子中exec語句的用法和eval r execfile...
python3中的eval和exec的區別與聯絡
看了很多網上的方法,寫入檔案後開啟檔案看確實不再是亂碼,但是從檔案中讀入json時發現了亂碼,可能是讀檔案預設的編碼格式不對。下面讀寫方法可行。注意,ensure ascii false可以保證不會以ascii格式編碼,保證中文的正常轉換 import js程式設計客棧on with open te...
exec函式 python 使用exec的疑惑
簡介 exec 執行儲存在字串或檔案中的python語句,相比於 eval,exec可以執行更複雜的 python exec函式功能強大,也很容易上手,在做未知變數定義時很好用。例如 使用exec函式可以將其中的字串語句定義為變數 with open data.txt r as f for line...