包装函数Python

时间:2012-03-30 20:00:42

标签: python decorator

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>

为什么???

2 个答案:

答案 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()