如果你有两个功能,如:
def A
def B
Run Code Online (Sandbox Code Playgroud)
和A打电话给B,你能得到谁在B里面叫B,比如:
def A () :
B ()
def B () :
this.caller.name
Run Code Online (Sandbox Code Playgroud) 我编写了一个装饰器,它记录用于调用特定函数或方法的参数.如下图所示,除了报告logRecord的行号是装饰器的行号而不是func正在包装的行号之外,它运行良好:
from functools import wraps
import inspect
import logging
arg_log_fmt = "{name}({arg_str})"
def log_args(logger, level=logging.DEBUG):
"""Decorator to log arguments passed to func."""
def inner_func(func):
line_no = inspect.getsourcelines(func)[-1]
@wraps(func)
def return_func(*args, **kwargs):
arg_list = list("{!r}".format(arg) for arg in args)
arg_list.extend("{}={!r}".format(key, val)
for key, val in kwargs.iteritems())
msg = arg_log_fmt.format(name=func.__name__,
arg_str=", ".join(arg_list))
logger.log(level, msg)
return func(*args, **kwargs)
return return_func
return inner_func
if __name__ == "__main__":
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
fmt = "%(asctime)s %(levelname)-8.8s [%(name)s:%(lineno)4s] %(message)s"
handler.setFormatter(logging.Formatter(fmt)) …Run Code Online (Sandbox Code Playgroud)