对于日志记录,我希望每个函数在函数的开头和结尾记录自己的名称。
def my_function():
print("Enter my_function")
# ...
print("Leave my_function")
如果我更改函数的名称,我也必须更新这些打印消息。我正在寻找一种自动化方法。
def my_decorator(func):
print("Enter ", func.__name__)
func()
print("Leave ", func.__name__)
def my_function():
# do the work
pass
# main:
my_decorator(my_function)
这是否可以通过简单的方式实现,也许使用装饰器?如果 my_function 有参数,这会是什么样子?
请您参考如下方法:
你是对的,使用装饰器是实现这种行为的完美方式。
您需要了解的是装饰器的工作原理:它只是将一个函数作为参数,并返回另一个函数。这个其他返回的函数旨在包装您的参数函数。
def log_in_out(func):
def decorated_func(*args, **kwargs):
print("Enter ", func.__name__)
result = func(*args, **kwargs)
print("Leave ", func.__name__)
return result
return decorated_func
@log_in_out
def my_function():
print("Inside my_function")
return 42
val = my_function()
print(val)
# Output:
# Enter my_function
# Inside my_function
# Leave my_function
# 42
另外,请注意@ŁukaszRogalski 的回答使用 functools.wraps对于保留函数文档字符串很有用。
最后,来自@MartinBonner 的一个好主意是您还可以使用它来记录函数中的错误:
def log_in_out(func):
def decorated_func(*args, **kwargs):
name = func.__name__
print("Enter", name)
try:
result = func(*args, **kwargs)
print("Leave", name)
except:
print("Error in", name)
raise
return result
return decorated_func
请注意,我重新抛出错误是因为我认为应该从函数外部管理控制流。
对于更高级的日志记录,您应该使用 the built-in module它提供了许多设施。
