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")
我在一本书中找到了这个代码,并按照它的说法运行...
suppress(myfunc)
这本书说应该运行该函数但是会抑制它中的错误,这是print("foo")
相反,它只是给了我......
<function myfunc at 0x6981e0>
为什么???
答案 0 :(得分: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"
答案 1 :(得分:1)
上面的代码示例中似乎有一个拼写错误。该代码将无法运行,因为Python无法解析它(第11行的SyntaxError)。如果你纠正了,也许我们可以看到真正的错误。
关于装饰器的使用,要看到这个suppress
的实际应用,你应该这样做:
@suppress
def myfunc():
...
# errors suppressed in this call
myfunc()