3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用頂級(jí)名稱空間是不可能的。當(dāng)你跑步
var = 1
它將鍵var和值存儲(chǔ)1在全局字典中。這大致相當(dāng)于調(diào)用globals().__setitem__('var', 1)。問(wèn)題是您不能在運(yùn)行的腳本中替換全局詞典(您可能可以通過(guò)弄亂堆棧來(lái)進(jìn)行替換,但這不是一個(gè)好主意)。但是,您可以在輔助名稱空間中執(zhí)行代碼,并為其全局變量提供自定義詞典。
class myglobals(dict):
def __setitem__(self, key, value):
if key=='val':
raise TypeError()
dict.__setitem__(self, key, value)
myg = myglobals()
dict.__setitem__(myg, 'val', 'protected')
import code
code.InteractiveConsole(locals=myg).interact()
這將啟動(dòng)一個(gè)REPL,該REPL幾乎可以正常運(yùn)行,但是拒絕任何設(shè)置變量的嘗試val。您也可以使用execfile(filename, myg)。請(qǐng)注意,這不能防止惡意代碼。
添加回答
舉報(bào)