在學流暢的python中 閉包 有段代碼
import time
def clock(func):
def clocked(*args):
t0=time.perf_counter()
result=func(*args)
elapsed=time.perf_counter()-t0
name=func.__name__
arg_str=','.join(repr(arg) for arg in args)
print('[%0.8fs] %s(%s) ->%r' %(elapsed,name,arg_str,result))
return result
return clocked
@clock
def snooze(seconds):
time.sleep(seconds)
@clock
def factorial(n):
return 1 if n<2 else n*factorial(n-1)
if __name__=='__main__':
print('*'*50,'calling snooze(.123)')
snooze(.123)
print('*'*50)
snooze(.567)
print('*'*50,'calling factor(6)')
print('6! =' ,factorial(6))
------------------------------------
以上是書上的原始碼 輸出和書上一致 與理解的也一致
根據理解先呼叫decorator 再呼叫func中代碼 但下面代碼 確沒有按理解的順序輸出
registry=set()
def register(active=True):
n=0
def decorate(func):
nonlocal n
print('running register(active=%s)->decorate(%s)' %(active,func))
#print('must be output')
if active:
registry.add(func)
else:
registry.discard(func)
#func()
print('must be output %s' %repr(n))
return func
#print('must be output')
n=n+1
return decorate
@register(active=False)
def f1():
print('running in f1')
@register()
def f2():
print('running in f2')
if __name__ == '__main__':
f1()
f2()
f2()
f1()
print(registry)
--------------------理解每次呼叫應該輸出 must be output 這句
running register(active=False)->decorate(<function f1 at 0x7f6e1fb082f0>)
must be output 1
running register(active=True)->decorate(<function f2 at 0x7f6e1fb08620>)
must be output 1
running in f1
running in f2
running in f2
running in f1
{<function f2 at 0x7f6e1fb08620>}
辛苦幫解答 沒有按呼叫次數輸出 must be output 這句的原因 多謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23110.html
