問題タブ [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.
python - コンテキストマネージャーを使用すると、変数へのアクセスが変更されるようです
リスト (たとえば、本) の各項目に対して API を呼び出して、本に関するメタデータを取得する作業プログラムがあります。book : メタデータを dict に保存して使用します。これにより、メタデータの収集中にユーザーが待機するため、過剰な呼び出しを避けるために、必要な場合にのみ応答を取得できるように、前述の API 呼び出しを行う前に dict を CSV に永続化し、それをロードしています。
ただし、永続化された dict を読み取るコンテキスト マネージャーを導入し、関数 ("gatherfiles()") に call-if-not-there ロジックを実行すると、3 番目の関数にアクセスできなくなります。
メイン関数を呼び出すと、gatherfiles() によって dict が返されることがわかりますが、3 番目の関数呼び出し (「pickabook()」) を行うと、keyerror が発生し、空の辞書が表示されます。
以下のコードの編集版を入れました。私の推測では、何らかの形でコンテキスト マネージャーがスコープを変更した (つまり、1 つの shimdict をグローバルとして、もう 1 つをローカルとして扱う) ことですが、私がオンラインで読むことができるものを考えると、それは正しくないようです。それで、醜くない考えはありますか?
---- 以下を編集 ---- 私は自分の質問を明確に十分に提起したとは思いません。コンテキストマネージャーが削除されている場合、「pickabook()」の辞書「shimdict」にアクセスできます。つまり、次のコードを使用します。
したがって、グローバルを使用するか、ローカル辞書を関数に渡してこれを修正できることを完全に理解していますが、コンテキストマネージャーを追加すると動作が変わる理由を知りたいです。
python - sudo を使用したファブリック コンテキスト マネージャー
run
前の実行の状態を保持するだけのコンテキストマネージャーを持つことは可能ですか? コード内:
編集:実用的な解決策ではなく、私が期待したもの
複数のコマンドを実行しようとしていますが、各コマンド間で状態を維持したいですか?
プレフィックス コンテキスト マネージャーを使用してみましたが、shell_env コンテキスト マネージャーでは機能しません: このコードを実行すると
ENV
設定してから、設定する必要があるアプリケーションを実行することを期待していましenv2
たが、プレフィックスは shell_env の前に実行されますか?
python - wxPython が SIGINT でコンテキスト マネージャの終了を飲み込むのを防ぐ
wxPython は、コンテキスト マネージャの__exit__
呼び出しが発生しないように SIGINT をインターセプトしているようです。この動作を修正する方法はありますか?
この問題を示す小さなテスト プログラムを次に示します。
このように実行して Ctrl+C を押すと、出力は生成されません。wx コードを sleep ステートメントに変更して Ctrl+C を押すと、コンテキスト マネージャーは期待どおりに動作します。
python - Python "with" ステートメント パイルアップ
私は、Python の "with" ステートメントを頻繁に使用する傾向があります。Pythonスクリプトがクラッシュしてもタスクは実行されるため、いくつかのファイルをディレクトリにシンボリックリンクまたはコピーした後、ディレクトリをクリーンアップすることがほとんどです。「with」ステートメントで使用できる on of my 関数の例を次に示します。
これらをステートメントで使用する方法は、非常に急速に積み重なる傾向があります。
強力な "with" ステートメントと同じように簡単かつ安全に上記を行うためのより良い方法はありますか?
python - ジェネレーターがコンテキストマネージャーではないのはなぜですか?
ジェネレーターがリソースを管理することは可能です。たとえばyield
、コンテキスト マネージャー内から 'ing することによってです。リソースはclose()
、ジェネレーターのメソッドが呼び出される (または例外が発生する) とすぐに解放されます。
最後に呼び出すのを忘れがちなので、close()
そのためにもコンテキストマネージャーを使用することは明らかだと思います(また、潜在的な例外を処理するためにも)。私はそれを使用できることを知っていますが、ステートメントcontextlib.closing
でジェネレーターを直接使用する方がはるかに優れていると思いませんか?with
ジェネレーターがコンテキストマネージャーであってはならない理由はありますか?
python - Python - 例外が with ブロックをスキップしているようです
関連するコードは次のとおりです。
わかりました、これをすべて書いて、私は今何が起こっているのか理解しています。デコレーターで作成している contextmanagerのexitメソッドは実行されていますが、もちろん、ジェネレーターにフローを返しません。
では、これをどのように行うべきですか?
python - 子コンテキストの管理を親に委任する方法
それ自体でコンテキストマネージャーとして機能するクラス「A」があるとしましょう。
インターフェース。with
クライアント コードがステートメントを使用して直接 'A' オブジェクトを作成することは有効です。
現在、他の機能をカプセル化し、「A」オブジェクトを利用する別のクラス「B」もあります。
「B」をコンテキスト マネージャーとしても機能させたい場合、「A」インスタンスを管理する正しい方法は何ですか?
'B' 呼び出しの実装と(それぞれ) その A オブジェクト インスタンスの実装は必要__enter__
ですか? それとももっと良い方法がありますか?__exit__
__enter__
__exit__
具体的な例を挙げると (これは私のアプリケーションで使用しているものではありません。頭に浮かんだ最初の非抽象的な例です)、2 つのクラスを考えます。
DatabaseConnection
DatabaseConnectionPool
DatabaseConnection
単一のものを単独で使用することは有効であるためDatabaseConnection
、context-manager インターフェースを実装します。
DatabaseConnectionPool
DatabaseConnections
他のビットとボブだけでなく、いくつかを利用します。を使用するDatabaseConnectionPool
と (つまり、"with" で)、そのインスタンスのセットアップと破棄が行われDatabaseConnection
ます (その他に必要なことは何でも実行されます)。
更新: 次の出力が得られることを望んでいたテスト コードをいくつか作成しました。
しかし、私は以下を得ました:
コード:
これを機能させる方法についてのアイデアはありますか?
python - Python で 3 ブロックのコンテキスト マネージャーを作成するにはどうすればよいですか?
コンテキスト マネージャー パターンを利用する多くの関数があります。
を使用しExitStack
て、これらすべてのコンテキスト マネージャーを呼び出します。
私はパターンを検討しています:
ソースを見て、何らかの方法で変更したいと考えていました。これを達成する良い方法はありますか?もう 1 つのオプションは、コンテキスト マネージャーを返すメソッドを各クラスに追加することです。メソッドを追加することの欠点は、コードの直感的な線形ビューが失われることです。中間のものは、予備のものと最終のものの間に配置されるのではなく、別の方法になるためです。これは、より論理的だと思います。
要求に応じて、追加のコード:
python - コンテキストマネージャーを使用したsh.cd
これが私が基本的にやろうとしていることです:
ただし、次のエラーが表示されます
ここで何が欠けていますか?コンテキスト内でディレクトリを変更する代替ソリューションはありますか?
python - urllib.request.urlopen を使用してリクエストを行うときに contextlib.closing を使用する利点はありますか?
私の質問を説明するために、使用しない基本的なリクエストを次に示しますcontextlib
。
そして、以下を使用した同じリクエストcontextlib
:
私が知る限り、これら 2 つのリクエストの結果は同じです。データが取得され、コード ブロックの完了時にリクエストが自動的に閉じraw_data
られ、リクエストが閉じられた後でもアクセス可能です。を使用してリクエストを行う場合、使用urllib.request.urlopen
する利点はありcontextlib.closing
ますか、それとも冗長ですか? 1つのアプローチは、よりPythonicおよび/またはより一般的ですか?