【问题标题】:design a decorator to write a function return value in a text file设计一个装饰器在文本文件中写入函数返回值
【发布时间】:2026-02-01 06:25:02
【问题描述】:

装饰器应该像

@log_message
def a_function_that_returns_a_string():
    return "a string"
@log_message
def a_function_that_returns_a_strings_with_a_newline(s):
    return "{}\n".format(s)

我的实现是这样的,但没有在文件中写入任何内容,我是装饰器的新手

 def log_message(func):
          def wrapper(*args, **kwargs):
              result = func(a)
              with open('test.txt', 'w') as f:
                 for row in results:
                     f.write("%s\n" % str(row))
              return result
          return wrapper

【问题讨论】:

  • 看来你刚刚复制了你得到的任务,现在正在分配给我们......
  • @mrCarnivore 我不明白装饰器的逻辑你能告诉我哪里错了
  • 记得以追加模式打开文件。否则,之前的结果将会丢失。 (这是作业吗?Python中有一个记录器模块,专为做你想做的事而设计......)
  • 最后,for row in results 需要一个迭代器。您确定您的退货类型吗?尝试看看如何改进。

标签: python python-2.7 python-decorators


【解决方案1】:

你离我们不远了: result = func(a) 必须是 result = func(*args, **kwargs)

这会打印到屏幕上。写入文件几乎相同:

def log_message(func):

    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print(result)
        return result

    return wrapper


@log_message
def a_function_that_returns_a_string():
    return "a string"

@log_message
def a_function_that_returns_a_strings_with_a_newline(s):
    return "{}\n".format(s)


a = a_function_that_returns_a_string()
b = a_function_that_returns_a_strings_with_a_newline('abc')

【讨论】:

  • 我们没有在 func 中发送任何值列表或 dict 我们正在发送一个简单的字符串,为什么我们在 args 或 kwargs 中捕获它
  • *args 捕获所有提供给包装器调用的参数(任何形式)。 **kwargs 捕获传递给包装器的所有关键字参数(例如形式 key='abc)。您需要将确切的参数传递给 func。否则参数会丢失。
  • 我记错了不需要返回结果
  • 你必须返回结果。否则你装饰的函数不会返回任何东西。