exec メソッドで使用する辞書をサブクラス化しようとしています。最終的には、ローカル関数にカスタムの名前スコープ動作を持たせたいと考えています。
以下のコードでは、関数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