一个关于python装饰器参数的问题
看到廖雪峰python教程上,python裝飾器一章
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000
在最后的作業題上
再思考一下能否寫出一個@log的decorator,使它既支持:
@log def f():pass?
又支持:
@log('execute') def f():pass即在裝飾器頭上加str,從而牽扯出了一個裝飾器參數傳入的問題。
?
討論區有人留言
用戶6223899516_84125?created at 6天前, Last updated at 6天前 import functools import timedef log2(text=None):def decorator(func):@functools.wraps(func)def wrapper(*args,**kw):if isinstance(text,(int,str)):print('%s begin call %s():' %(text,func.__name__))func(*args,**kw)print('%s end call %s():' %(text,func.__name__))else:print('begin call %s():' % func.__name__)func(*args,**kw)print('end call %s():' % func.__name__)returnreturn wrapperreturn decorator if isinstance(text,(int,str)) else decorator(text) @log2 def now2():print('now is:'+time.asctime())now2()@log2('timeshow') def now3():print('now is:'+'2017-07-10')now3()最后的if語句其實我是參考其他人的,但是我突然覺得很不理解, 為什么if有參數的時候是 return decorator, 而else(無參數)的時候是 return decorator(text)
誰能給解釋一下。。我怎么總覺得寫反了呢?不過從結果來看是對的~
?
以及下面的回復
在調試里面跑了一下,不寫參數的時候,text拿到的實際是函數對象,就是本來func應該拿到的那個,結果讓text提前吃掉了,截胡了你程序里的now。
這里不寫字符串的話,text不會拿到None,而是直接被賦值成函數。調試里面跑到這一步,text的屬性是指向一個function。
如果把return里面那個decorator(text) 直接改成decorator,執行會提示缺參數。因為內層的func這個量已經沒參數可接了。
decorator(text) 的意思就是,如果發現text不是str類型,那么就是本該傳給內層func的函數讓外層提前拿走了,并且放在了text里面。這時應該手動把text傳給里面那層,于是就return了 decorator(text)
通過這個問題,大概搞明白裝飾器參數傳入的問題了。
python應該會從外層向內層逐層匹配。
轉載于:https://www.cnblogs.com/gk2017/p/7196736.html
總結
以上是生活随笔為你收集整理的一个关于python装饰器参数的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一吨水等于多少立方米
- 下一篇: 中班教案《小蚂蚁避雨》反思