如何从Python装饰器内部访问装饰方法局部变量(locals())?

时间:2011-08-19 15:01:59

标签: python python-3.x decorator

这就是我需要的:

假设我有这个装饰者:

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。

2 个答案:

答案 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