周海漢 /文
2010.4.11
@dec1
@dec2
def test(arg):
pass
其效果類似於
dec1(dec2(test(arg)))
修飾函式還可以帶引數。
@dec1(arg1,arg2)
def test(testarg)
效果類似於
dec1(arg1,arg2)(test(arg))
示例1 引數型別和返回值型別檢查
對於python這樣的動態語言,不像c++這樣的一開始就有嚴格靜態的型別定義。但是,在某些情況下,就需要這樣的型別檢查,那麼可以採用@修飾的方式。下面的示例就是檢查輸入引數型別和返回值型別的例子。
#!/usr/bin/env python
#coding:utf8
defaccepts
(* types) :
defcheck_accepts
( f) :
assert
len( types)
== f. func_code. co_argcount
defnew_f
(* args,
** kwds) :
for( a, t)
inzip
( args, types) :
assert
isinstance
( a, t),
\"arg %r does not match %s "% ( a, t)
return f(* args,
** kwds)
new_f. func_name = f. func_name
return new_f
return check_accepts
defreturns
( rtype) :
defcheck_returns
( f) :
defnew_f
(* args,
** kwds) :
result = f(* args,
** kwds)
assert
isinstance
( result, rtype),
\"return value %r does not match %s "% ( result, rtype)
return result
new_f. func_name = f. func_name
return new_f
return check_returns
@accepts
(int,(
int,
float))@
returns
((int
,float
))def
func
( arg1, arg2) :
return arg1 * arg2
if __name__ == '__main__ ':
a = func(
3, 'asdf ')
zhouhh@zhouhh-home:~$ ./checktype.py
traceback (most recent call last):
file "./checktype.py", line 27, in
@returns((int,float))
file "./checktype.py", line 5, in check_accepts
assert len(types) == f.func_code.co_argcount
assertionerror
其實,xml-rpc中,對於函式引數,返回值等都需要採用xml的方式傳遞到遠端再呼叫,那麼如何檢查型別呢?就可以用到如上的@修飾符。
python中的各種符號
在這裡所作的是將所有的 python 符號和關鍵字列出來,這些都是值得掌握的重點。關鍵字 and del from not while as elif global or with assert else if pass yield break except import print class e...
Python中符號的用法
1.如果字串內部既包含 又包含 怎麼辦?可以用轉義字元 來標識,比如 i m ok 表示的字串內容是 i m ok 轉義字元 可以轉義很多字元,比如 n表示換行,t表示製表符,字元 本身也要轉義,所以 表示的字元就是 可以在python的互動式命令列用print 列印字串看看 print i m o...
python中 符號詳解
a 星期幾的簡寫 a 星期幾的全稱 b 月分的簡寫 b 月份的全稱 c 標準的日期的時間串 c 年份的後兩位數字 d 十進位制表示的每月的第幾天 d 月 天 年 e 在兩字元域中,十進位制表示的每月的第幾天 f 年 月 日 g 年份的後兩位數字,使用基於周的年 g 年分,使用基於周的年 h 簡寫的月...