如何制作一个检查变量是否存在的装饰器?

时间:2016-02-17 00:04:23

标签: python decorator

我试图学习如何制作自己的装饰师。我不明白如何打电话"正在包装的函数内的数据。

我正在尝试创建一个非常简单的装饰器,它将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>

1 个答案:

答案 0 :(得分:2)

根据您的代码示例,您的装饰器代码无法访问 message 的值。请记住,装饰器是对函数调用的包装器。在您的代码中消息是在 test()函数范围内定义的。

你可以在你的函数中有一个名为message的全局变量...声明为 global ......但这非常混乱,通常被认为是糟糕的设计。

您可以重新构造此代码,以便 test()是某个类的方法;和消息是一个实例属性(或类属性,如果你想成为该类的所有实例的“全局”)。然后将其称为 self.message (通常使用 self )。

您还可以更改 test()以返回元组((message,c)),然后修改您的装饰以提取消息并返回其余内容: msg, result = f(*args, **kwargs)您使用 msg 作为邮件并返回结果

请记住装饰器是包装器,您可以深入了解您正在调用的函数范围。