我试图学习如何制作自己的装饰师。我不明白如何打电话"正在包装的函数内的数据。
我正在尝试创建一个非常简单的装饰器,它将msg的值写入文本文件。
def logging(f):
def decorator(args, **kwargs):
debug_file = "/tmp/easylog.txt"
fh = open(debug_file, 'a')
fh.write(f.message + "\n")
fh.close()
return decorator
@logging
def test(a,b):
c=a+b
message = "hello test"
return c
test(4,5)
因此,我不明白该怎么做的部分是检查装饰者内部的消息。
在我阅读的所有基本教程中,它都展示了如何获取整个返回值并以粗体或其他方式打印,我试图学习如何获取单个值并操纵它们。 / p>
答案 0 :(得分:2)
根据您的代码示例,您的装饰器代码无法访问 message 的值。请记住,装饰器是对函数调用的包装器。在您的代码中消息是在 test()函数范围内定义的。
你可以在你的函数中有一个名为message的全局变量...声明为 global ......但这非常混乱,通常被认为是糟糕的设计。
您可以重新构造此代码,以便 test()是某个类的方法;和消息是一个实例属性(或类属性,如果你想成为该类的所有实例的“全局”)。然后将其称为 self.message (通常使用 self )。
您还可以更改 test()以返回元组((message,c)),然后修改您的装饰以提取消息并返回其余内容: msg, result = f(*args, **kwargs)
您使用 msg 作为邮件并返回结果。
请记住装饰器是包装器,您可以深入了解您正在调用的函数范围。