私がしたいと思います:この例ではPythonのコンテキストマネージャデコレータする(および逆)
# Simple example, one could replace try/except by any other nested construct
def mycontextmanager_generator(foo):
try:
yield
except:
print 'bar'
raise
mycontextmanager = build_contextmanager(mycontextmanager_generator)
mydecorator = build_decorator(mycontextmanager_generator)
>>> with mycontextmanager():
>>> raise Exception('baz gone bar in context manager')
... bar
>>> @mydecorator()
>>> def bazzer():
>>> raise Exception('baz gone bar in decorator')
>>> bazzer()
... bar
は、Iが生成機能からコンテキストマネージャを構築し、同じ機能のデコレータ。これは私が失敗した方法で達成しようとしたものです。私が欲しいものより一般的
は、DRYになることです:書き込みがtry/except
ブロックたら、再度デコレータとコンテキストマネージャ両方を通してそれを再使用:試みを書き込むことによって/圏除いて一度だけを、ジェネレータ関数またはその他のラッパーに関係なく使用できます。
(PY2でPY3/contextlib2
でcontextlib
中)ContextDecorator
事はクラスでのみ使用可能ですが、その場合には無用のようですが...私は何かが足りないのですか? __enter__
と__exit__
を使用して、クラスベースのContextManagerでtry/exceptブロックを実装する方法はありますか?
yield
構文で構築されたコンテキストマネージャをデコレータに変換する可能性はありますか?
または逆の(デコレータからコンテキストマネージャ)?
もしそうでない場合は、その点に関してPythonの制限が何であるかを知っておきたいと思います。
私の理解では、yield
の構文はPythonインタプリタとコンテキストの切り替えに非常に厳密に縛られており、その点でその動作を変更できるかどうかはわかりません。
だから、あなたが上記のケースを 'yield'を使用したいが、まだ例外を除いて、正しいですか? – syntonym
あなたが何を求めているのか分かりません。あなたは外部ライブラリを参照しているように見えますが、私はあなたが意味するものを知っていると思いますが、私はここでもう一度推測しています(https://pypi.python.org/pypi/contextdecorator)。どのライブラリを使用しているか、どのバージョンのPythonとより具体的な動作の例(サンプル/擬似コード、期待/望ましい出力)を記述できますか? – Dunes
@Dunesはpy3で 'contextlib'(これはデコレータやコンテキストマネージャーで遊んでいる人は知っているだろうと思っていました)ですが、実際にはもっと明確にするために質問を更新するつもりです – lajarre