私は次のスタイルで書かれた既存のコードをいくつか持っていて、期待どおりに動作します。私はコンテキストマネージャーとしてchunkUndoを使用できます。私は上記のように、すでに書かれたコンテキストマネージャのコードの多くを持っているのでPython 2.7でクラスを使わずにデコレータとしてコンテキストマネージャを作る方法は?
from contextlib import contextmanager
from functools import wraps
@contextmanager
def chunkUndo(mode='simple'):
print 'mode:',mode
print 'undo chunk start'
try:
yield
finally:
print 'undo chunk end'
# this works
with chunkUndo():
print 'do work here'
しかし、私はclass based contextDecoratorsにそれらを変更したくありません。代わりに、私はすでに、それデコレータ機能のようなものを作るためにchunkUndo装飾するためにデコレータを追加したい:
def makeContextDecorator(f):
@wraps(f)
def wrapper(*args, **kw):
# some code here
return wrapper
@makeContextDecorator
@contextmanager
def chunkUndo(mode='simple'):
print 'mode:',mode
print 'undo chunk start'
try:
yield
finally:
print 'undo chunk end'
@chunkUndo
def do_work():
print 'do work'
do_work()
最終的な結果は、私はおそらく同様にそれに引数を渡し、デコレータとコンテキストマネージャとしてchunkUndo
の両方を使用することができますです。それ、どうやったら出来るの ?
下のコードで動作するように変更した後でも、 'chunkUndo'が(' with'文の)先頭のコードと同じように動作するように正しく理解していますか?私は、あなたの 'makeContextDecorator'関数がその場合にはもっと洗練されたものでなければならないと思っています(単なる関数ではなくクラスかもしれません)。 – Blckknght
はい私は上記のコードはまだ動作します。目的は、 'chunkUndo'を' context manager'と 'decorator'として動作させることですが、クラスを使用することはありません。 – Shuman
なぜあなたはクラスを使わないでそれをする必要がありますか?私は、次の男ほど精神的なレベルの爪で叩きつけるのが大好きですが、ある時点では、言語があなたにそれをやりたいと望むようにする必要があります。 – kindall