我需要实现一个表达式,例如:
def expr():
return a
必须使用exec进行调用:
exec(expr.__code__, expenv)
其中expenv
是继承ordereddict的类的实例。所有丢失的变量必须自动创建。
我尝试覆盖__missing__
方法,但是它不起作用。
from collections import OrderedDict
class ExprGlobals(OrderedDict):
def __init__(self):
super(ExprGlobals, self).__init__()
def __missing__(self, key):
self[key] = 7
return self[key]
def expr():
return a
expenv = ExprGlobals()
exec (expr.__code__, expenv)
输出为 NameError:未定义全局名称'a'。 变量a应该自动创建,并且等于7。
from collections import OrderedDict
class ExprGlobals(OrderedDict):
def __init__(self):
self['a'] = 7
super(ExprGlobals, self).__init__()
def __missing__(self, key):
self[key] = 7
return self[key]
def expr():
return a
expenv = ExprGlobals()
exec (expr.__code__, expenv)
此代码将正确运行。但这不是解决方案。