首页 > 解决方案 > 请协助开发 Python 装饰器

问题描述

描述

实现一个 Python 装饰器,它应该接受任何被装饰函数返回的内容,并将其写入新行中的文件。为了解决这个问题,让我们假设修饰函数总是返回一个字符串。装饰器应命名为 log_message,并应写入文件 /tmp/decorator_logs.txt。

实现以下设计

@log_message
def a_function_that_returns_a_string():

      return "A string"

@log_message
def a_function_that_returns_a_string_with_newline(s):

      return "{}\n".format(s)

@log_message
def a_function_that_returns_another_string(string=""):

            return "Another string"

标签: pythonfunction

解决方案


这是装饰器:

def log_message(func):
    def wrap(*args,**kwargs):
        res = func(*args,**kwargs)
        with open('/tmp/decorator_logs.txt','wt') as f:
            f.write(res)
        return res
    return wrap

但是从您在评论中对您所做的事情的描述来看,您似乎并没有完全理解装饰器的概念。

你可以把它想象decorator成一个特殊的函数,它接受另一个函数作为输入并返回一个修饰函数,它做一些稍微不同的事情。

在上面的代码中,log_message获取它所装饰的任何函数,并定义一个名为wrap. 该wrap函数接受任何输入,将这些输入参数传递给 func,将 func 的返回结果写入tmp/decorator_logs.txt文件,然后返回相同的结果。

您需要了解的另一件事是

@log_message
def decorated_function():
    ....

是相同的:

decorated_function = log_message(decorated_function)

希望这有助于您理解decorator.


推荐阅读