問題タブ [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 に答える
286 参照

python - コンテキストマネージャーを使用すると、変数へのアクセスが変更されるようです

リスト (たとえば、本) の各項目に対して API を呼び出して、本に関するメタデータを取得する作業プログラムがあります。book : メタデータを dict に保存して使用します。これにより、メタデータの収集中にユーザーが待機するため、過剰な呼び出しを避けるために、必要な場合にのみ応答を取得できるように、前述の API 呼び出しを行う前に dict を CSV に永続化し、それをロードしています。

ただし、永続化された dict を読み取るコンテキスト マネージャーを導入し、関数 ("gatherfiles()") に call-if-not-there ロジックを実行すると、3 番目の関数にアクセスできなくなります。

メイン関数を呼び出すと、gatherfiles() によって dict が返されることがわかりますが、3 番目の関数呼び出し (「pickabook()」) を行うと、keyerror が発生し、空の辞書が表示されます。

以下のコードの編集版を入れました。私の推測では、何らかの形でコンテキスト マネージャーがスコープを変更した (つまり、1 つの shimdict をグローバルとして、もう 1 つをローカルとして扱う) ことですが、私がオンラインで読むことができるものを考えると、それは正しくないようです。それで、醜くない考えはありますか?


---- 以下を編集 ---- 私は自分の質問を明確に十分に提起したとは思いません。コンテキストマネージャーが削除されている場合、「pickabook()」の辞書「shimdict」にアクセスできます。つまり、次のコードを使用します。

したがって、グローバルを使用するか、ローカル辞書を関数に渡してこれを修正できることを完全に理解していますが、コンテキストマネージャーを追加すると動作が変わる理由を知りたいです。

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

python - sudo を使用したファブリック コンテキスト マネージャー

run前の実行の状態を保持するだけのコンテキストマネージャーを持つことは可能ですか? コード内:

編集:実用的な解決策ではなく、私が期待したもの

複数のコマンドを実行しようとしていますが、各コマンド間で状態を維持したいですか?

プレフィックス コンテキスト マネージャーを使用してみましたが、shell_env コンテキスト マネージャーでは機能しません: このコードを実行すると

ENV設定してから、設定する必要があるアプリケーションを実行することを期待していましenv2たが、プレフィックスは shell_env の前に実行されますか?

0 投票する
0 に答える
177 参照

python - wxPython が SIGINT でコンテキスト マネージャの終了を飲み込むのを防ぐ

wxPython は、コンテキスト マネージャの__exit__呼び出しが発生しないように SIGINT をインターセプトしているようです。この動作を修正する方法はありますか?

この問題を示す小さなテスト プログラムを次に示します。

このように実行して Ctrl+C を押すと、出力は生成されません。wx コードを sleep ステートメントに変更して Ctrl+C を押すと、コンテキスト マネージャーは期待どおりに動作します。

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

python - Python "with" ステートメント パイルアップ

私は、Python の "with" ステートメントを頻繁に使用する傾向があります。Pythonスクリプトがクラッシュしてもタスクは実行されるため、いくつかのファイルをディレクトリにシンボリックリンクまたはコピーした後、ディレクトリをクリーンアップすることがほとんどです。「with」ステートメントで使用できる on of my 関数の例を次に示します。

これらをステートメントで使用する方法は、非常に急速に積み重なる傾向があります。

強力な "with" ステートメントと同じように簡単かつ安全に上記を行うためのより良い方法はありますか?

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

python - ジェネレーターがコンテキストマネージャーではないのはなぜですか?

ジェネレーターがリソースを管理することは可能です。たとえばyield、コンテキスト マネージャー内から 'ing することによってです。リソースはclose()、ジェネレーターのメソッドが呼び出される (または例外が発生する) とすぐに解放されます。

最後に呼び出すのを忘れがちなので、close()そのためにもコンテキストマネージャーを使用することは明らかだと思います(また、潜在的な例外を処理するためにも)。私はそれを使用できることを知っていますが、ステートメントcontextlib.closingでジェネレーターを直接使用する方がはるかに優れていると思いませんか?with

ジェネレーターがコンテキストマネージャーであってはならない理由はありますか?

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

python - Python - 例外が with ブロックをスキップしているようです

関連するコードは次のとおりです。

わかりました、これをすべて書いて、私は今何が起こっているのか理解しています。デコレーターで作成している contextmanagerのexitメソッド実行されていますが、もちろん、ジェネレーターにフローを返しません。

では、これをどのように行うべきですか?

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

python - 子コンテキストの管理を親に委任する方法

それ自体でコンテキストマネージャーとして機能するクラス「A」があるとしましょう。

インターフェース。withクライアント コードがステートメントを使用して直接 'A' オブジェクトを作成することは有効です。

現在、他の機能をカプセル化し、「A」オブジェクトを利用する別のクラス「B」もあります。

「B」をコンテキスト マネージャーとしても機能させたい場合、「A」インスタンスを管理する正しい方法は何ですか?

'B' 呼び出しの実装と(それぞれ) その A オブジェクト インスタンスの実装は必要__enter__ですか? それとももっと良い方法がありますか?__exit____enter____exit__

具体的な例を挙げると (これは私のアプリケーションで使用しているものではありません。頭に浮かんだ最初の非抽象的な例です)、2 つのクラスを考えます。

  • DatabaseConnection
  • DatabaseConnectionPool

DatabaseConnection単一のものを単独で使用することは有効であるためDatabaseConnection、context-manager インターフェースを実装します。

DatabaseConnectionPoolDatabaseConnections他のビットとボブだけでなく、いくつかを利用します。を使用するDatabaseConnectionPoolと (つまり、"with" で)、そのインスタンスのセットアップと破棄が行われDatabaseConnectionます (その他に必要なことは何でも実行されます)。

更新: 次の出力が得られることを望んでいたテスト コードをいくつか作成しました。

しかし、私は以下を得ました:

コード:

これを機能させる方法についてのアイデアはありますか?

0 投票する
0 に答える
131 参照

python - Python で 3 ブロックのコンテキスト マネージャーを作成するにはどうすればよいですか?

コンテキスト マネージャー パターンを利用する多くの関数があります。

を使用しExitStackて、これらすべてのコンテキスト マネージャーを呼び出します。

私はパターンを検討しています:

ソースを見て、何らかの方法で変更したいと考えていました。これを達成する良い方法はありますか?もう 1 つのオプションは、コンテキスト マネージャーを返すメソッドを各クラスに追加することです。メソッドを追加することの欠点は、コードの直感的な線形ビューが失われることです。中間のものは、予備のものと最終のものの間に配置されるのではなく、別の方法になるためです。これは、より論理的だと思います。


要求に応じて、追加のコード:

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

python - コンテキストマネージャーを使用したsh.cd

これが私が基本的にやろうとしていることです:

ただし、次のエラーが表示されます

ここで何が欠けていますか?コンテキスト内でディレクトリを変更する代替ソリューションはありますか?

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

python - urllib.request.urlopen を使用してリクエストを行うときに contextlib.closing を使用する利点はありますか?

私の質問を説明するために、使用しない基本的なリクエストを次に示しますcontextlib

そして、以下を使用した同じリクエストcontextlib:

私が知る限り、これら 2 つのリクエストの結果は同じです。データが取得され、コード ブロックの完了時にリクエストが自動的に閉じraw_dataられ、リクエストが閉じられた後でもアクセス可能です。を使用してリクエストを行う場合、使用urllib.request.urlopenする利点はありcontextlib.closingますか、それとも冗長ですか? 1つのアプローチは、よりPythonicおよび/またはより一般的ですか?