一个装饰器用于 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