从exec语句访问全局范围 - 受限制的python

时间:2017-08-23 10:50:17

标签: python scope

我意识到问题有点具体,对不起。

我试图解决一个蟒蛇拼图,我输入的内容得到exec' ed。我的目标是在全局名称空间中存储任意长度的内容(例如,更改变量target)。您将在下面看到我的输入仅限于35字符。

以下是该计划:

#!/usr/bin/env python2

from sys import modules
modules.clear()
del modules

raw_input2 = raw_input
exception2 = Exception

__builtins__.__dict__.clear()
__builtins__ = None

target = None # change this !

while 1:
    try:
        scope = {'r':0}
        exec 'r = ' + raw_input2()[:35] in scope
        print 'Result:', scope['r']
    except exception2, e:
        print "Error: ", e

如上所述,我的意思是将数据存储在某个地方,因为vars会在每个循环中重置。

  • 我知道我可以使用globals()['target']=xxx,但内置版已被停用。
  • 理论上我可以使用global target;target=xxx,但这会在scope中执行,而不是在全局范围内(我认为global关键字必须出现在匿名函数的开头)< / LI>
  • 我知道所有变量都存储在某个__dict__对象中,但我知道写入其中的唯一方法是通过globals()['target']=xxx禁用
  • 我知道您可以使用().__class__.__base__痛苦地访问超级对象,但是35个字符的限制,它似乎不是那种方式(仅此字符串为{{已经有1个}字符,你需要两个以21开头,所以只留下0;字符来分配内容......)。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

答案是:写在__builtins__

示例输入:

1;__builtins__['a']="string1"
Result: 1
1;__builtins__['a']+="string2"

...实际上看起来很简单,因为它正好位于问题中标记为# change this的变量之上。我还不完全理解为什么__builtins__ var在exec范围内传递,特别是因为它应该是None(因此不是字典),但可以像字典那样赋值。

但它有效,在python 2.7中测试