【发布时间】:2013-12-07 23:39:34
【问题描述】:
假设我想用 exec 实现一个标识装饰器(即,它不应该对没有参数的函数完全不做任何事情)。当我尝试使用该装饰器定义闭包时,范围会在 f_factory 函数的末尾继续存在并更改接下来的内容。
我想了解为什么最后一次打印返回“1b”而不是“1”。
def exec_identity(f):
gl = globals()
gl.update({'f':f})
exec "def idfun(): return f()" in gl, locals()
return idfun
class CallableClass(object):
def __init__(self, s):
self.s = s
def make_callable(self):
def f_factory(s):
def f():
print s
return exec_identity(f)
#return f
return f_factory(self.s)
c1 = CallableClass("1")
f1 = c1.make_callable()
f1()
c1.s = "1b"
f1()
f1b = c1.make_callable()
f1b()
f1()
"""
Result:
1
1
1b
1b
"""
我知道,如果我可以让这样的 exec 语句按预期工作:
exec "def idfun(): return f()" in {'f':f}, locals()
【问题讨论】: