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

ответ

1

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

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

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

Я отредактировал его вопрос. Я не думаю, что ошибка синтаксического анализа часть вопроса. – wberry

+0

Синтаксическая ошибка связана с тем, что вы указываете код как есть в itnerpreter, с тем, чтобы отделить два независимых блока кода. Код будет работать в программе как есть - вам нужно добавить новую строку там – jsbueno

+0

Нет, исходный код был только что отредактирован. Ранее он читал 'print (" foo) 'в последней строке. –

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

Вы подразумеваете, что есть что-то особенное в функциях декоратора, а это не так. для 'myfunc = supress (myfunc)'. Нет, вам не нужно применять 'suppress' в качестве декоратора. – agf

+0

Зависит от того, что ваше определение« нужно »:-) Я просто имел в виду, что ему нужно применить его * как-то *. Хотя @ sy ntax немного отличается (для рекурсии), здесь я согласен, что два способа применения 'suppress' эквивалентны. – wberry

+0

Ответ @agf был отредактирован. – wberry

Смежные вопросы