在decorators中访问原始函数变量

2024-06-01 01:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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())。有没有办法在decorator函数中访问它们?你知道吗


Tags: 函数nameselfstackdefvarswrappertracer
1条回答
网友
1楼 · 发布于 2024-06-01 01:14:53

您不需要使用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

回溯包含一系列链接的执行帧;每个帧都有一个对该帧中使用的局部变量的引用。你知道吗

您确实非常希望清理对回溯的引用;因为回溯包含包装器函数框架,所以您有一个循环引用,最好尽早中断。你知道吗

相关问题 更多 >