Python中的exec和eval函式

2021-09-06 10:19:53 字數 1509 閱讀 9071

函式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...