这是使用装饰器记录方法及其参数的好方法吗?

2024-09-30 18:30:39 发布

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

所以我尝试创建一个decorator函数来记录方法及其参数。下面是我创建的decorator函数:

def logInstanceMethod(infoMessage=None):
  def logFunction(f):
    def function(self,*args, **kwdargs):
      #Info Logging
      if infoMessage is None:
        logging.info("Running method: " + f.__code__.co_name)
      else:
        logging.info(infoMessage)

      #Debug logging
      logging.debug('Running method: ' + f.__code__.co_name)

      if len(args) > 0:
        logging.debug("With args: ")
        for arg in args:
          logging.debug(arg)
      if len(kwdargs) > 0:
        logging.debug("With keyword args: ")
        for kwdarg in kwdargs:
          logging.debug(kwdarg)

      return(f(self, *args, **kwdargs))
    return(function)
  return(logFunction)

如果我将它用于以下方法:

@logInstanceMethod("Method A is running...")
def methodA(self, a):
    print("You ran this function with the parameters: " + a)

然后运行loggingLevel=DEBUG

methodA('MyParam')

它将记录:

INFO Method A is running...
DEBUG Running method: methodA
DEBUG With args:
DEBUG MyParam

它会打印:

You ran this function with the parameters: MyParam

所以上面的decorator函数完成了我希望它完成的100%,但是为了让函数运行,我需要有一行:return(f(self, *args, **kwdargs))。我不喜欢这样,因为这意味着正确调用的函数依赖于这行代码。有没有办法让被记录的方法在不直接返回logging decorator方法中的函数的情况下仍然执行?这对我来说似乎是个糟糕的设计,即使它能工作。你知道吗


Tags: 方法函数debugselfreturnifloggingdef