如何为带参数的函数编写装饰器?

时间:2021-03-20 08:07:59

标签: python stdout python-decorators

我想编写一个装饰器来将主函数的标准输出重定向到特定的日志文件。 main 函数采用的参数是 - item,我希望装饰器为 main 函数的每个 item 分配不同的日志路径。我如何实现这一目标?

目前我有:

def redirect_stdout(func):
    def wrapper():
        with open(f"{log_path}{item}.log", "w") as log, contextlib.redirect_stdout(log), contextlib.redirect_stderr(log):
            func(item)
    return wrapper()

@redirect_stdout
def main(item):

但我不确定 item 参数如何进入装饰器。谢谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找的内容如下

def redirect_stdout(func):
    def wrapper(item):
        with open(f"{log_path}{item}.log", "w") as log, contextlib.redirect_stdout(log), contextlib.redirect_stderr(log):
            func(item)
    return wrapper

要了解其工作原理,您需要正确了解装饰器的工作原理。检查下面我试图解释装饰器是如何工作的。 ==> 我曾经表示这相当于。



@redirect_stdout
def main(item):
    pass

== >

def main(item):
    pass

main = redirect_stdout(main) = wrapper
---------
main(item) => wrapper(item)