in Python ist ein Dekorateur genau das gleiche wie eine Funktion auf eine Funktion aufrufen?

StackOverflow https://stackoverflow.com/questions/3074672

Frage

Ich dachte, das zu tun

@f
def g():
   print 'hello'

ist genau die gleiche wie

def g():
   print 'hello'
g=f(g)

Aber, ich hatte diesen Code, dass Verwendungen contextlib.contextmanager:

@contextlib.contextmanager
def f():
    print 1
    yield
    print 2
with f:
    print 3

, die funktioniert und die Erträge 1 3 2

Und wenn ich versuchte, es in sich ändern

def f():
    print 1
    yield
    print 2
f=contextlib.contextmanager(f)
with f:
    print 3

ich AttributeError: 'function' object has no attribute '__exit__'

Was bin ich? ist es speziell in contextlib.contextmanager einige schwarze Magie, oder muss ich falsch verstehen, wie Dekorateure in der Regel arbeiten?

War es hilfreich?

Lösung

Ja, Dekorateur ist genau das gleiche wie eine Funktion aufrufen und Rückgabewert zuweisen

In diesem Fall Fehler kommt, weil Sie nicht Funktion aufrufen werden, so richtigen Code wäre

def f():
    print 1
    yield
    print 2

f=contextlib.contextmanager(f)
with f():
    print 3

auch ich bin nicht sicher, ob Sie Code getestet, weil Dekorateur Code, den Sie gegeben haben, werden aufgrund gleichen Grund scheitern

@contextlib.contextmanager
def f():
    print 1
    yield
    print 2
with f:
    print 3

Fehler:

    with f:
AttributeError: 'function' object has no attribute '__exit__'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top