我想要在exec方法中使用字典的子類。 最終,我想本地函數有一個自定義名稱範圍的行爲。exec()方法中的自定義名稱空間的子類python字典
在下面的代碼中,功能b()
確實具有正確的globals()
字典可用,但是在解析z
時無法搜索它。
功能b()
先不搜locals()
然後globals()
?
非常令人費解。 任何幫助表示讚賞。
t = '''
def b():
# return (globals()['z']) #works
return z #fails
b()
'''
class MyDict(dict):
def __init__(self, g):
dict.__init__(self)
self.my_g = g
def __getitem__(self, key):
print("GET ", key)
try:
val = dict.__getitem__(self, key)
except:
print("GET exception1")
val = self.my_g[key]
return val
g = {'z':123}
md = MyDict(g)
#fails to find z
exec(t, md, md)
#works
#exec(t, g, g)
輸出
GET b
Traceback (most recent call last):
File "/project1/text12", line 31, in <module>
File "<string>", line 6, in <module>
File "<string>", line 4, in b
NameError: global name 'z' is not defined
返回z失敗,因爲沒有變量z。你說return(globals()['z'])有效,返回z時你想完成什麼? –
我希望從傳入的全局字典中解析出z,正如下面的答案中所述。乾杯 – rbairos