in Python ist ein Dekorateur genau das gleiche wie eine Funktion auf eine Funktion aufrufen?
-
28-09-2019 - |
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?
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__'