所以我试图创建一个记录方法及其参数的装饰器函数。这是我创建的装饰器功能:
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
所以上面的装饰器函数完成了我想要它做的100%,但为了让函数运行,我需要有一行:return(f(self, *args, **kwdargs))
。我不喜欢这个,因为这意味着正确调用的函数依赖于该行代码。是否有任何方法让正在记录的方法仍然执行而不直接在日志记录装饰器方法中返回函数?这对我来说似乎是糟糕的设计,即使它有效。