访问装饰器中的原始函数变量

时间:2016-07-21 07:50:29

标签: python python-2.7 decorator python-decorators

我在python中创建了一个日志记录模块,它将运行时发生的每个异常报告给服务器,因此在我必须编写的每个函数中都有:

def a_func():
    try:
        #stuff here
        pass
    except:
        Logger.writeError(self.__class__.__name__, inspect.stack()[1][3],\ 
            tracer(self, vars()))

正如您所看到的,我使用vars()函数来获取导致异常的变量。我读到了装饰器,我决定使用它们:

def flog(func):
    def flog_wrapper(*args, **kwargs):
       try:
           func(*args, **kwargs)
       except Exception as e:
           print "At flog:", e
           #self.myLogger.writeError(self.__class__.__name__, inspect.stack()[1][3], tracer(self, vars()))
    return flog_wrapper

问题是我无法访问原始函数的(func)变量(vars())。有没有办法在装饰器功能中访问它们?

1 个答案:

答案 0 :(得分:0)

您不需要使用vars()。异常的追溯具有您需要的一切:

import sys

def flog(func):
    def flog_wrapper(self, *args, **kwargs):
       try:
           return func(self, *args, **kwargs)
       except Exception:
           exc_type, exc_value, tb = sys.exc_info()
           print "At flog:", exc_value
           locals = tb.tb_frame.f_locals
           self.myLogger.writeError(type(self).__name__, inspect.stack()[1][3], tracer(self, locals))
           del tb
    return flog_wrapper

回溯包含一系列链接的执行帧;每个框架都有对该框架中使用的本地人的引用。

你非常希望清理对追溯的引用;因为回溯包含包装函数框架,所以你有一个循环引用,最好早点打破。