编写带参数decorator

无参的@log装饰器:

def log(f):
    def fn(x):
        print ‘call ‘ + f.__name__ + ‘()...‘
        return f(x)
    return fn

发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。

如果有的函数非常重要,希望打印出‘[INFO] call xxx()...‘,有的函数不太重要,希望打印出‘[DEBUG] call xxx()...‘,这时,log函数本身就需要传入‘INFO‘或‘DEBUG‘这样的参数,类似这样:

@log(‘DEBUG‘)
def my_func():
    pass

把上面的定义翻译成高阶函数的调用,就是:

my_func = log(‘DEBUG‘)(my_func)

上面的语句看上去还是比较绕,再展开一下:

log_decorator = log(‘DEBUG‘)
my_func = log_decorator(my_func)

上面的语句又相当于:

log_decorator = log(‘DEBUG‘)
@log_decorator
def my_func():
    pass

所以,带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数:

def log(prefix):
    def log_decorator(f):
        def wrapper(*args, **kw):
            print ‘[%s] %s()...‘ % (prefix, f.__name__)
            return f(*args, **kw)
        return wrapper
    return log_decorator

@log(‘DEBUG‘)
def test():
    pass
print test()

执行结果:

[DEBUG] test()...
None
时间: 2024-10-13 16:15:13

编写带参数decorator的相关文章

python中编写带参数decorator

考察上一节的 @log 装饰器: def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发现对于被装饰的函数,log打印的语句是不能变的(除了函数名). 如果有的函数非常重要,希望打印出'[INFO] call xxx()...',有的函数不太重要,希望打印出'[DEBUG] call xxx()...',这时,log函数本身就需要传入'INFO'或'DEBUG'这样的参数,类似这样:

[译]SSRS 编写带参数的MDX报表

编写MDX报表长久以来对于报表人员来说都比较痛苦. 当然如果你用查询设计器(Query Designer) 直接拖拉数据集那就很方便,但是你们有没有想过查询设计器是怎么创建MDX的.或者创建的参数是如何工作的? 我听到很多用Analysis Services 作为数据源的(包括我)报表人员说写参数太难了,所以他们用查询设计器做报表. 我想关键的问题是查询设计器做的MDX看起来要比实际上更复杂.如果你知道一些MDX基础,你应该能直接写MDX而不是用查询分析器 ,你就是喜欢用查询分析器也没关系.本文

vb如何编写带执行参数的exe程序

关于vb如何编写带执行参数的exe程序 ,可以通过vb自带的 "command()"  命令来完成. 下面是CSDN说明: Command 函数 返回命令行的参数部分,该命令行用于装入 Microsoft Visual Basic 或 Visual Basic 开发的可执行程序. 语法 Command 说明 当从命令行装入 Visual Basic 时,/cmd 之后的命令行的任何部分作为命令行的参数传递给程序.下面的示例中,cmdlineargs 代表 Command 函数返回的参数

spring mvc 编写处理带参数的Controller

在上一随笔记录的基础上,现记录编写处理带有参数的Controller. @Controller //这个注解会告知<context:component:scan> 将HomeController自动检测为一个Bean@RequestMapping("/home")  //这是根Urlpublic class HomeController {        private UserService userService;        @Autowired    public

25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

package zhongqiuzuoye; public class Rect { public double width; public double height; Rect(double width,double height) //带有两个参数的构造方法,用于将width和height属性初化; { this.width=width; this.height=height; } Rect() //不带参数的构造方法,将矩形初始化为宽和高都为10. { width=10; height=

python带参数和不带参数装饰器

http://blog.csdn.net/pipisorry/article/details/41902599 对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数对象名: 对于有参数的装饰器在调用时使用的是应用的参数,@timeStumpFunc_args(argv)的argv,已不再是要被装饰的函数对象名,所以必须在内部再定义一个函数getfunc()来接收要被装饰的函数对象. #!/usr/bin/env python # coding=gbk """ __title

【转】如何在命令行脚本中启动带参数的Windows服务

我们有一个自己编写的Windows服务,我们希望该服务在启动时可以根据用户输入的参数实现不同的功能. 要实现这样的需求并不是很难,下面这个例子我用来示范如何编写该服务 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Diagnostics; 6 using System.Linq; 7 using Syste

西门子PLC学习笔记十八-(带参数FC编程)

带参数FC,指编辑功能时,在局部变量声明表中定义形式参数,在功能(FC)中使用虚拟的符号地址完成程序的编写. 下面将例举简单的示例说明如何编写带参FC功能. 本示例完成一数学公式的编程:Y = ( X + 5 ) * 11 / 5; 程序如下: FC数学公式编写如下(内部定义了输入参数变量:X和输出参数变量Y) 本程序代码可以在此下载.

西门子PLC学习笔记十七-(不带参数FC编程二)

不带参数FC编程示例二,本次是要实现如下功能: 1.当未按下自动按钮时,可以分别手动控制3个灯的亮灭. 2.当按下自动按钮后,则这3个灯依次循环闪烁,每次亮的时间是1s 程序编写如下: FC1:手动控制 FC2:自动控制 程序可以在此下载.