调用返回和不调用之间装饰器的区别是什么

时间:2017-05-16 09:52:31

标签: python return decorator

我们假设我们有一个功能:

@log
def now():
    print '2015'

两个不同装饰者之间的区别是什么:

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        func(*args, **kw)
    return wrapper
def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        return func(*args, **kw)
    return wrapper

2 个答案:

答案 0 :(得分:0)

如果包装器不包含return语句,则不会返回该函数的返回值。

换句话说,该函数一旦被包装,将停止返回一个值。

这可能是期望的行为,但是包装器通常不应该更改函数签名(尽管Python的函数实际上没有签名)。

答案 1 :(得分:0)

对于您的示例,您将看不到任何差异,因为函数now() 返回 None,其副作用是print "2015"。但是,如果您考虑now()返回值的情况,您将开始获得意外结果。

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        func(*args, **kw)
    return wrapper

@log
def now():
    return 1

产地:

>>> x = now()
call now():   #print 'call %s():' % func.__name__
>>> print x
None

现在我们试图从now()函数获取的值丢失了,因为它永远不会返回wrapper的值,而是永远不会返回{{1}的值}}