2012-03-30 169 views
1
def suppress(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     except Exception: 
      pass 
    return wrapper 
def myfunc(): 
    print("foo") 
    print("foo") 

我發現這個代碼在書上,並運行它,它怎麼說的......包裝函數的Python

suppress(myfunc) 

書上說這是應該運行的功能,但抑制它的錯誤,這是在print("foo") 相反,它只是給了我一個

<function myfunc at 0x6981e0> 

爲什麼???

+2

因爲這就是'壓制'所做的:它需要一個功能併爲您提供另一個功能。如果你想調用這個函數,可以直接調用它:'suppress(myfunc)()'(注意在這個函數末尾加上括號來調用函數) – kindall 2012-03-30 20:26:23

回答

1

看起來上面的代碼示例中存在拼寫錯誤。該代碼不會運行,因爲Python無法解析它(第11行的SyntaxError)。如果你糾正,也許我們可以看到什麼是錯的。

關於裝飾的使用,看到這suppress在行動,你應該做的:

@suppress 
def myfunc(): 
    ... 
# errors suppressed in this call 
myfunc() 
+1

我編輯了他的問題,我不認爲解析錯誤是問題的實質的一部分 – wberry 2012-03-30 20:09:55

+0

語法錯誤與在itnerpreter中編寫代碼一樣,withotu分離了兩個獨立的代碼塊。代碼將按原樣運行 - 您必須在其中添加一個換行符 – jsbueno 2012-03-30 20:21:59

+0

不,最初的代碼剛剛被編輯過,它之前在最後一行讀到'print(「foo)' – 2012-03-30 20:25:00

2

suppress功能被設計爲一個裝飾,所以你需要將它應用到你的函數/方法。慣用的方法是使用@語法,就像您使用functools.wraps一樣。

import functools 

def suppress(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     except Exception: 
      pass 
    return wrapper 

@suppress # <-------- this is the idiomatic fix 
def myfunc(): 
    "documentation" 
    print("foo") 
    raise ValueError 

def myfunc2(): 
    "documentation" 
    print("foo") 
    raise ValueError 

myfunc() # prints "foo", does not raise exception 
print myfunc.__doc__ # prints "documentation" 

suppress(myfunc2)() # functional style; prints "foo", does not raise exception 
print suppress(myfunc2).__doc__ # prints "documentation" 
+2

你在暗示裝飾器函數有一些特殊之處,沒有,它只是一個更好的synax對於'myfunc = supress(myfunc)'。所以不,你不需要申請'suppress'作爲裝飾器。 – agf 2012-03-30 20:37:06

+0

取決於你對「need」的定義是:-)我只是說他需要應用它*不知何故*。儘管@ sy ntax有點不同(遞歸),這裏我同意應用'suppress'的兩種方法是等價的。 – wberry 2012-03-30 20:55:25

+0

@agf答案已被編輯。 – wberry 2014-07-09 13:55:40