我们假设我们有一个功能:
@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
答案 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}的值}}