Оболочка Функция Python - PullRequest
       4

Оболочка Функция Python

1 голос
/ 31 марта 2012
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 ]

2 голосов
/ 31 марта 2012

Ваша 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 голос
/ 31 марта 2012

Кажется, в приведенном выше примере кода есть опечатка. Этот код не будет работать, потому что Python не может его проанализировать (SyntaxError в строке 11). Если вы исправите это, возможно, мы увидим, что действительно не так.

Что касается использования декораторов, чтобы увидеть это suppress в действии, вы должны сделать:

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