一个装饰器用于 3 种不同的功能
one decorator for 3 different functions
我正在写 python API,我有一个问题。
我有 3 个不同的功能:
func1() -> return only text
func2(name) -> return text only but takes parameter
func3(name) -> this function create a file "name".txt
现在我的装饰器有问题,我想创建一个日志装饰器,每次调用函数时都会调用它。
问题是我不知道如何简单地做到这一点,我知道如何在没有参数或一个参数的情况下创建它,但我不知道如何创建适用于所有三个功能的通用装饰器。
现在我有这样的东西:
def log(func):
def wrapper(name):
func(name)
log = ('write something here')
f = open('log.txt', 'a+')
f.write(log + "\n")
f.close(name)
return wrapper
您的包装器应该接受任意数量的参数,使用 *args
和 **kwargs
语法来捕获位置参数和关键字参数。确保 return 无论包装函数 returns:
def log(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
log = ('write something here')
with open('log.txt', 'a+') as f:
f.write(log + "\n")
return result
return wrapper
您可能想在 @functools.wraps
decorator 中添加;这会将所有文档和其他元数据从原始包装函数复制到新包装器:
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
log = ('write something here')
with open('log.txt', 'a+') as f:
f.write(log + "\n")
return result
return wrapper
最后但同样重要的是,与其自己重新打开日志文件,不如查看 logging
module 来为您处理日志文件。
def log(func):
def wrapper(*args, **kwds):
log = func(*args, **kwds)
f = open('log.txt', 'a+')
f.write(log + "\n")
f.close()
return wrapper
@log
def func1():
return "Called function 1"
@log
def func2(name):
return "Called function 2 with " + name
@log
def func3(name):
f = open('name.txt', 'a+')
f.write(name + " from func3\n")
f.close()
return "Called function 3 with " + name
def main():
func1()
func2("func2")
func3("func3")
if __name__ == '__main__':
main()
Log.txt 变为:
Called function 1
Called function 2 with func2
Called function 3 with func3
我正在写 python API,我有一个问题。 我有 3 个不同的功能:
func1() -> return only text
func2(name) -> return text only but takes parameter
func3(name) -> this function create a file "name".txt
现在我的装饰器有问题,我想创建一个日志装饰器,每次调用函数时都会调用它。 问题是我不知道如何简单地做到这一点,我知道如何在没有参数或一个参数的情况下创建它,但我不知道如何创建适用于所有三个功能的通用装饰器。
现在我有这样的东西:
def log(func):
def wrapper(name):
func(name)
log = ('write something here')
f = open('log.txt', 'a+')
f.write(log + "\n")
f.close(name)
return wrapper
您的包装器应该接受任意数量的参数,使用 *args
和 **kwargs
语法来捕获位置参数和关键字参数。确保 return 无论包装函数 returns:
def log(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
log = ('write something here')
with open('log.txt', 'a+') as f:
f.write(log + "\n")
return result
return wrapper
您可能想在 @functools.wraps
decorator 中添加;这会将所有文档和其他元数据从原始包装函数复制到新包装器:
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
log = ('write something here')
with open('log.txt', 'a+') as f:
f.write(log + "\n")
return result
return wrapper
最后但同样重要的是,与其自己重新打开日志文件,不如查看 logging
module 来为您处理日志文件。
def log(func):
def wrapper(*args, **kwds):
log = func(*args, **kwds)
f = open('log.txt', 'a+')
f.write(log + "\n")
f.close()
return wrapper
@log
def func1():
return "Called function 1"
@log
def func2(name):
return "Called function 2 with " + name
@log
def func3(name):
f = open('name.txt', 'a+')
f.write(name + " from func3\n")
f.close()
return "Called function 3 with " + name
def main():
func1()
func2("func2")
func3("func3")
if __name__ == '__main__':
main()
Log.txt 变为:
Called function 1
Called function 2 with func2
Called function 3 with func3