python functools.wraps functools.partial实例解析

一:python functools.wraps 实例

1. 未使用wraps的实例

#!/usr/bin/env python
# coding:utf-8
def logged(func): def with_logging(*args, **kwargs): '''i am wraps's doc''' print func.__name__ + " was called" return func(*args, **kwargs) return with_logging @logged def f(x): """i am original doc""" return x + x * x print f.__name__ # 期望的是原本的名字f,结果换成了装饰器里的新函数的名字with_logging print f.__doc__ # 期望的是原本的注释,加了个装饰器成了新加装饰器里的注释了

 

2. 使用了wraps的实例

from functools import wraps


def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        '''i am wraps's doc'''
        print func.__name__ + " was called"
        return func(*args, **kwargs)

    return with_logging


@logged
def f(x):
    """i am original doc"""
    return x + x * x


print f.__name__  # prints 'f'
print f.__doc__  # prints 'i am original doc'

 

二:python functools.partial 实例解读

#!/usr/bin/env python
# coding:utf-8

from functools import partial

# 函数在执行时,要带上所有必要的参数进行调用。但是,有时参数可以在函数被调用之前提前获知。这种情况下,
# 一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。
def add(a, b):
    return a+b
add(4, 3)    # 普通执行函数的方式
plus = partial(add, 10)    # 预先输入一部分参数10,
plus(2)    # 再输入剩下的参数,超出少于都会报错;
plus = partial(add, 10, 2)    # 预先输入所有参数
plus()    # 不能再有入参了


def add2(a, b, c=2):    # 有默认值的函数
    return a + b + c
plus3 = partial(add2, 1)
plus3(1, 2)
partial(add2, 101)(1)


def add3(*argv, **kwargs):    # 不限制入参
    return reduce(lambda x,y:x+y, argv)
plus4 = partial(add3, 1, 2)
plus4()

 

posted @ 2017-10-31 19:02  aaron_agu  阅读(330)  评论(0编辑  收藏  举报