看上去一脸懵逼,其实原理很好懂,主要是要知道eval函数的定义中,第二个可选参数是eval运行环境的全局变量: eval(source, globals=None, locals=None, /) Evaluate the given source inthe context ofglobalsand locals.
The source may be astring representing a Python expression ora code object as returned by compile(). The globals must be a dictionary and locals can be any mapping, defaulting tothe current globalsand locals. If only globals is given, locals defaults toit. 直接eval会报NameError,变量未定义,那么我们只要让所有的变量都定义为它的变量名字串就好了 所以用type写一个dict的子类,修改__getitem__,将所有键的值定义为键的字串,然后用这个替换eval的命名空间dict就可以了 是不是很妙呢?感觉各种json库都可以不使用了哈哈哈