問題タブ [contextmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
373 参照

python - いくつかの関数を同じステートメントでラップするためのPythonの方法は何ですか

PythonライブラリFabricを使用して、リモートサーバーのメンテナンスを行っています。コマンドをステートメントと組み合わせてラップしない限り、Fabricはリモートコマンドとローカルコマンドへのすべての応答を自動的に出力します。そのように、ローカルマシンでは、

またはリモートマシンでこのように:

私は長くて複雑なタスクを書いていますが、ステートメントを使ってこれら2つを何度も繰り返しています。その繰り返しを防ぐために、_mute()という関数を書きたいと思います。それは私にこのようなことをさせてくれるでしょう:

私はいくつかの解決策を調べましたが、「eval」が私のためにこれを行うことができることを知っています。しかし、私がevalについて読んだすべてのページは、セキュリティの問題のために、ほとんどの場合、それは悪い考えであることを示唆しています。パーシャルを調べましたが、_mute関数で引数を呼び出し可能にする方法がわかりませんでした。私がここで見逃しているより高いレベルのPythonの概念があると思います。これを行うためのPythonの方法は何ですか?あなたが提供できるかもしれないどんな方向にも感謝します。

0 投票する
2 に答える
2347 参照

python - 本体のコードの前に呼び出されるコンテキストマネージャー出口

私はPythonで独自のコンテキストマネージャーを作成することで遊んでいます。実装が原因で、奇妙な動作が見られる可能性があります。

__exit__'with'コンテキストのステートメントの前に呼び出されたコードが表示されます。たとえば、コードスニペットは次のとおりです。

そしてそれは例外です:

__enter__コンテキストマネージャーのすべての、、、__exit__およびupdateメソッドにデバッグを入れました。__exit__update()の前に呼び出されたようです。これは意味がないので、私は単純な何かを見逃しているに違いありません。

これが私の単純なコンテキストマネージャークラスです。

0 投票する
7 に答える
21737 参照

python - コンテキストマネージャー__enter__()で例外をキャッチ

__exit__()に例外があってもメソッドが確実に呼び出されるようにすることは可能__enter__()ですか?

編集

これは私が得ることができる限り近いです...

後から考えると、コンテキスト マネージャーは最適な設計上の決定ではなかった可能性があります。

0 投票する
1 に答える
6242 参照

python - threading.Lock をコンテキスト マネージャーとして使用する

threadingモジュールのドキュメントには、次のように書かれています。

acquire()メソッドを持つこのモジュールによって提供されるすべてのオブジェクトは、ステートメントrelease()のコンテキスト マネージャーとして使用できます。withこのacquire()メソッドは、ブロックに入るときにrelease()呼び出され、ブロックから出るときに呼び出されます。

ブロッキング モードと非ブロッキング モードのどちらで呼び出されるのか疑問に思っていました。

0 投票する
1 に答える
1140 参照

python - ContextManager中に発生するキャッチ例外-Python

重複の可能性:
try-exceptブロックでpython「with」ステートメントを使用する

openPythonでファイルを開くために使用しています。withファイル処理を次のようなステートメントにカプセル化します。

このようにして、例外がスローされた場合でも、ファイルが閉じられていることを確認します。

OSErrorただし、ファイルを開くことができない(anがスローされる)場合に対処したいと思います。これを行う1つの方法は、withブロック全体をに配置することtry:です。これは、ファイル処理コードがOSErrorをスローしない限り機能します。

次のようになります。

もちろんこれは機能せず、本当に醜いです。これを行うための賢い方法はありますか?

ありがとう

PS:私はPython3.3を使用しています

0 投票する
1 に答える
793 参照

python - contextlib.contextmanager による継承

与えられたクラス

そこからどのように継承しますか?

0 投票する
2 に答える
3842 参照

python - functools.wrapsでは、Python3のクラスで関数をラップできません

ファイルを最初の引数として取るいくつかの関数のデコレータを書きたいと思います。デコレータはコンテキストマネージャプロトコルを実装する必要があるため(つまり、ラップされた関数をコンテキストマネージャに変換する)、関数をクラスでラップする必要があると考えました。

私はデコレータパターンの経験があまりなく、これまでコンテキストマネージャを実装したことはありませんが、私が書いたものはPython 2.7で機能し、コメントアウトするとPython3.3でも機能しwrapsます。

行のコメントを解除するときに発生するエラーは、次のwraps内部で発生しますupdate_wrapper

このようなクラスで関数をラップするために使用できるとドキュメントに記載されていないことは知っていますがfunctools.wraps、Python 2でも機能します。このトレースバックが正確に何を示しているのか、何をすべきかを誰かに説明してもらえますか?wrapsPythonの両方のバージョンでの効果を達成するには?


編集:私は間違っていた。上記のコードは、私が望んでいることを実行しません。ビルトインのように、の有無にかかわらず関数使用できるようにしたいと思います。 withopen

上記のコードは、装飾された関数をコンテキストマネージャーに変換します。私ができるようになりたい:

と同様

したがって、私のバージョンのコードは、おそらく次のようになります。

私が見落としたものについては、遠慮なくコメントしてください。

:JFセバスティアンによるクラスバージョンは、次のように機能するようです。

基本的wrapsにクラスからを削除し、次のように変更return CManagerしました。

0 投票する
2 に答える
11276 参照

python - Pythonのwith...asステートメントに依存するのは良い習慣ですか

python の with...as ステートメントに依存することが安全または適切な方法と見なされるかどうか、興味があります。たとえば、ファイルを開くとき:

したがって、この例では明示的に呼び出すことを怠っていましたが、Python がオブジェクトメソッドを呼び出してステートメントをmyFile.close()終了したときに呼び出されたと想定できます。これに依存することは良い習慣/安全ですか、それとも常に明示的に呼び出す方が良いでしょうかwith...as__exit__()file.close()

0 投票する
4 に答える
10341 参照

python - スレッドを使用した Python タイムアウト コンテキスト マネージャー

シグナルで完全に動作するコンテキスト マネージャーがありtimeoutますが、シグナルはメイン スレッドでのみ機能するため、マルチスレッド モードでエラーが発生します。

のデコレータの実装を見てきましたが、から派生したクラス内timeoutで渡す方法がわかりません。私のバリアントは機能しません。yieldthreading.Thread

0 投票する
3 に答える
7488 参照

python - Pythonで__del__の使用を回避するためにコンテキストマネージャーを使用するにはどうすればよいですか?

常識であるため、Python__del__メソッドは、このメソッドが呼び出されることが保証されていないため、重要なものをクリーンアップするために使用しないでください。別の方法は、いくつかのスレッドで説明されているように、コンテキストマネージャーを使用することです。

しかし、コンテキストマネージャーを使用するようにクラスを書き直す方法がよくわかりません。詳述すると、ラッパークラスがデバイスを開閉し、クラスのインスタンスがそのスコープから外れた場合(例外など)にデバイスを閉じるという単純な(機能しない)例があります。

最初のファイルmydevice.pyは、デバイスを開いたり閉じたりするための標準のラッパークラスです。

このクラスは別のクラスによって使用されmyclass.pyます:

私の質問:mydevice.pywithメソッド__enter____exit__メソッドでコンテキストマネージャーを実装する場合、このクラスをどのように処理できmyclass.pyますか?私は次のようなことをする必要があります

しかし、それをどのように処理するのですか?多分私は何か重要なことを見落としていましたか?または、クラススコープ内の変数としてではなく、関数内でのみコンテキストマネージャーを使用できますか?