2012-03-30 65 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