タイトルはばかげているようですが、正確に表現する方法がわかりません。ごめんなさい。
(セキュリティのためにRestrictedPythonを介して)ユーザーコードを評価する必要があるプログラムがあり、evalのグローバルに関数を入れて、eval時にデバッグ情報を出力できるようにします(簡略化)。
class UserException(Exception):
pass
def err(msg):
# ? how to get the globals variable in eval ?
A = globals().get('A', 'A not found')
return UserException("%s and A's value is %r" % (msg, A))
g = {
'err': err,
'A': None,
'__builtins__': {},
}
print eval('A or err("A not true")', g)
これにより、結果が得られます。
A not true and A's value is 'A not found'
ここで「globals()」を使用すると、「err」はもちろん間違っています。しかし、どうすれば「err」内の「g」の値を取得できますか?