这就是我需要的:
假设我有这个装饰者:
def deco(func):
def decoret(*args, **kwargs):
print(func.__locals__) # I know __locals__ is not valid, but I need something like this
return decoret
@deco
def func():
test1 = 123
test2 = 456
func()
我想获取所有局部变量的列表(好像我在函数中调用了locals()),所以我可以使用test1和test2访问字典装饰者的 decoret 函数中的值。
我知道我可以通过使用Python检查模块来做到这一点,但是我无法跟踪正确的框架以获得该功能。
另外,我正在使用Python 3.2 CPython。
答案 0 :(得分:3)
函数中 没有本地人,直到它被执行。装饰时唯一可用的东西是它定义时的内容。
d = 'd'
def a(d=d):
b = 'b'
c = 'c'
print a.__dict__
# {}
print a.b
# AttributeError: 'function' object has no attribute 'b'
print dir(a)
# Doesn't print anything
答案 1 :(得分:1)
实际上,我找到了一种方法,可以使用sys中的跟踪来规避和实现它。
看看这个片段:
def Property(function):
keys = 'fget', 'fset', 'fdel'
func_locals = {'doc':function.__doc__}
def probeFunc(frame, event, arg):
if event == 'return':
locals = frame.f_locals
func_locals.update(dict((k,locals.get(k)) for k in keys))
sys.settrace(None)
return probeFunc
sys.settrace(probeFunc)
function()
return property(**func_locals)
从位于http://code.activestate.com/recipes/410698/
的代码片段中获取此信息另外,请查看此stackoverflow主题:Python: static variable decorator