python - 请协助开发 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"
解决方案
这是装饰器:
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
.
推荐阅读
- sql - How do I fix a ORA-00902: invalid datatype creating a table
- vb.net - How can i make my own command to my first console application in VB.NET?
- javascript - Module parse failed when using bigint literal in Angular
- c++ - Recording desktop to file, using openCV
- r - totals = FALSE 仍然在 R 包 summarytools ctable() 中输出总数?
- python - 端口 9050 Not Listening tb selenium
- javascript - 通过 websocket 以低延迟和无中断的方式流式传输音频
- c# - Automapper - 从 2 个来源映射实体
- c# - JsonPatchDocument applyTo() 没有使用所有属性,为什么?
- facebook - 在 LinkedIn 上共享可在 Facebook 上共享的 URL