Python 自定义装饰器与函数的可变参数

1.函数的可变参数

参考来源

def f(*args, **kw):

*:代指元组,长度不限

**:代表键值对,个数不限

def f(*args, **kw):
    print len(args)
    print args
    for i in kw:
        print i:kw[i]

f(1,a,2,name='wu', age=111)

#输出:
'''
3
1,a,2
name=wu
age=111
'''

2.自定义装饰器

参考来源

让函数作为装饰器函数的参数,达到装饰函数的效果(函数命名随意)..用try...except,进行异常捕获,然后再外嵌一个带参数的函数来重跑(参数用于设定最多重跑的次数)

来分析这个式子, 可以看出至少要满足以下几个条件 
1. 装饰器函数运行在函数定义的时候 
2. 装饰器需要返回一个可执行的对象 
3. 装饰器返回的可执行对象要兼容函数f的参数

被装饰器函数修饰的函数,将会作为参数传入装饰器函数中,目的是使代码更加简洁。

import time
def decorator(max):
    def _decorator(fun):
        def wrapper(*args, **kwargs):
            start = time.time()
            for i in xrange(max):
                fun(*args, **kwargs)
            runtime = time.time()-start
            print runtime
        return wrapper
    return _decorator
# 循环f()函数两次
@decorator(2)
def do_something(name):
    for i in range(1000000):
        pass
    print "play game " + name

do_something("san guo sha")

---------------------

#本文来自 TangHuanan 的CSDN 博客 ,全文地址请点击:#https://blog.csdn.net/TangHuanan/article/details/45094497?utm_source=copy 

 

3.自适应参数-装饰器

# 装饰器-记录函数是否运行
def running_log(arg):
    if callable(arg):  # callable判断arg是否为函数,类等可调用对象
        @functools.wraps(arg)  # 保证被装饰的实体名,没有被替换
        def _demo(*args, **kwargs):
            print('%s is running!' % arg.__name__)
            return arg(*args, **kwargs)

        return _demo
    else:
        def _demo(func):
            @functools.wraps(func)
            def __demo(*args, **kwargs):
                if arg == 'warning':
                    print('warning: %s is running!!' % func.__name__)
                return func(*args, **kwargs)

            return __demo

        return _demo


# 灵活参数装饰器使用
# 装饰器不带参数
@running_log
def No_arg(a, b):
    print(a + b)


@running_log('warning')
def Have_arg(a, b):
    print(a + b)


No_arg(1, 2)
Have_arg(3, 4)

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值