in [4]
:def
log(func):.
..: time=0.
..:def
(*arg,
**kw):.
..:print
("call %s()"
%func.__name__)..
.: time+=1.
..:print
("---time----:"
,time)..
.:#return func(*args,**kw)..
.:in [5]
: @log
...:def
now():
...:
print
("---test----"
)in [6]
: now(
)call now(
)unboundlocalerror: local variable 'time' referenced before assignment
in [9]
:def
log(func):.
..: time=0.
..:def
(*arg,
**kw):.
..:print
("call %s()"
%func.__name__)..
.:nonlocal time
...: time+=1.
..:print
("---time----:"
,time)..
.:#return func(*args,**kw)..
.:in [10]
: @log
...:def
now():
...:
print
("---test----"
)in [11]
: now(
)call now()-
--time---
-:1in [12]
: now(
)call now()-
--time---
-:2in [13]
: now(
)call now()-
--time---
-:3
in [22]
:def
log(func):.
..: time=0.
..: time+=1.
..:print
("----log---time:"
,time)..
.:def(
*arg,
**kw):.
..:print
("call %s()"
%func.__name__)..
.: time2=5.
..: time2+=1.
..:print
("---time----:"
,time)..
.:return func(
*arg,
**kw)..
.:in [23]
: @log
...:def
now():
...:
print
("---test----")-
---log-
--time:
1in [24]
: now(
)call now()-
--time---
-:1-
--test---
-in [25]
: now(
)call now()-
--time---
-:1-
--test---
-
分析
in [52]
:def
log(text):.
..:print
("---日誌--").
..:def
decorator
(func):.
..:print
("---test__").
..:def
(*args,
**kw):.
..:print
("%s %s ()"
%(text,func.__name__)).
..:return func(
*args,
**kw)..
.:...
:return decorator
in [53]
: @log(
"execute").
..:def
now():
...:
print
("i love you ")-
--日誌---
--test__
in [54]
:#此處相當於now=log("execute")(now)
in [55]
: now(
)execute now (
)i love you
in [56]
: now.__name__
out[56]
:
python 中使用裝飾器對在執行期對函式進行一些外部功能的擴充套件。但是在使用過程中,由於裝飾器的加入導致直譯器認為函式本身發生了改變,在某些情況下——比如測試時——會導致一些問題。python 通過 functool.wraps 為我們解決了這個問題:在編寫裝飾器時,在實現前加入 @functools.wraps(func) 可以保證裝飾器不會對被裝飾函式造成影響
in [60]
:def
log(text):.
..:print
("---日誌--").
..:.
..:def
decorator
(func):.
..:print
("---test__").
..: @functools.wraps(func)..
.:def(
*args,
**kw):.
..:print
("%s %s ()"
%(text,func.__name__)).
..:return func(
*args,
**kw)..
.:...
:return decorator
in [61]
: @log(
"execute").
..:def
now():
...:
print
("i love you ")-
--日誌---
--test__
in [62]
: now(
)execute now (
)i love you
in [64]
: now.__name__
out[64]
:'now'
參考: js 區域性變數 全域性變數 閉包
什麼是變數?變數的命名規範 1 變數名必須以字母.下標符號 或者 開頭 2 變數名的長度不得超過255個字元 3 變數名中不可以使用空格,並且開頭不得以數字開頭 4 不用使用指令碼語言中保留的關鍵字及保留符號作為變數名 5 變數名是區分大小寫的,var a 1和var a 1 指在程式中只在特定過程...
閉包 全域性變數與區域性變數
報錯 unboundlocalerror local variable t referenced before assignment 在 python 中,如果乙個函式使用了和全域性變數相同的名字且改變了該變數的值,那麼該變數就會變成區域性變數,那麼就會造成在函式中我們沒有進行定義就引用了,所以會報...
python全域性變數 區域性變數
定義在函式內的變數有區域性作用域,在乙個模組中最高端別的變數有全域性作用域。全域性變數的乙個特徵是除非被刪除掉,否則它們的存活到指令碼執行結束,且對於所有的函式,它們的值都是可以訪問的。global str global string def foo local str local string r...