2012-03-30 5 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") 

fand ich diesen Code in einem Buch, und es lief, wie es gesagt ...Wrapper Funktion Python

suppress(myfunc) 

Das Buch sagte, es sollte die Funktion laufen, aber den Fehler darin zu unterdrücken, das war in print("foo") Stattdessen es nur mir so gab ...

<function myfunc at 0x6981e0> 

Warum ???

+2

Denn das ist es, was "unterdrücken" tut: Es braucht eine Funktion und gibt Ihnen eine andere Funktion. Wenn Sie diese Funktion aufrufen möchten, rufen Sie sie auf: 'suppress (myfunc)()' (beachten Sie zusätzliche Klammern, um die Funktion aufzurufen. – kindall

Antwort

1

Es scheint, als ob ein Tippfehler in Ihrem Codebeispiel oben ist. Dieser Code wird nicht ausgeführt, weil Python ihn nicht analysieren kann (SyntaxError in Zeile 11). Wenn Sie das korrigieren, können wir vielleicht sehen, was wirklich falsch ist.

In Bezug auf Nutzung von Dekorateure, um zu sehen, diese suppress in Aktion, Sie tun sollten:

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

Ich habe seine Frage bearbeitet. Ich glaube nicht, dass der Parse-Fehler ist Teil des Inhalts der Frage – wberry

+0

Der Syntaxfehler hat damit zu tun, dass der Code wie in einem I/N Prepreter zwischengespeichert wird, ohne die beiden unabhängigen Code-Blöcke zu trennen, der Code würde in einem Programm laufen - Sie müssen dort einen Zeilenvorschub hinzufügen – jsbueno

+0

Nein, der ursprüngliche Code wurde gerade bearbeitet, er hat vorher 'print ("foo)' in der letzten Zeile gelesen. –

2

Ihre suppress Funktion als Dekorateur gestaltet, so dass Sie es auf Ihre Funktionen/Methoden anwenden müssen. Der idiomatische Weg ist die @ Syntax, wie Sie es mit functools.wraps getan haben.

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

Sie unterstellen, dass es etwas Besonderes an Decorator-Funktionen gibt. Es gibt kein. Es ist nur ein schöneres Synax für 'myfunc = supress (myfunc)'. Also nein, du musst nicht "suppress" als Dekorator anwenden. – agf

+0

Hängt davon ab, was deine Definition von "brauchen" ist :-) Ich meinte nur, dass er es anwenden muss * irgendwie *. Obwohl das @ sy Ntax ist ein bisschen anders (für Rekursion), hier stimme ich zu, dass die beiden Möglichkeiten, 'unterdrücken' zu verwenden, äquivalent sind. – wberry

+0

@agf Antwort wurde bearbeitet. – wberry

Verwandte Themen