問題タブ [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 - `with` ブロックへの再試行のカプセル化
with
データベース トランザクションのロジックをブロックにカプセル化しようとしています。コードをトランザクションにラップし、さまざまな例外を処理します (ロックの問題)。これは非常に簡単ですが、特定の例外に続くコード ブロックの再試行をブロックにカプセル化することも必要です。これをコンテキストマネージャーにきちんとパッケージ化する方法がわかりません。
with
ステートメント内でコードを繰り返すことは可能ですか?
このままシンプルに使いたいと思います。
私は現在これをデコレーターで処理していますが、コンテキストマネージャー (または実際には両方) を提供したいのでwith
、デコレーターでラップされたインライン関数ではなく、ブロックで数行のコードをラップすることを選択できます、これは私が現在行っていることです:
python - Pythonでファイルを開いたり閉じたりする
以下の形式を使用してファイルを開くと、それを読みました
ファイルを明示的に閉じる必要はありません。誰かがなぜそうなのか説明できますか? また、誰かがファイルを明示的に閉じた場合、望ましくない影響はありますか?
python - コンテキスト マネージャー __exit__() 関数でオブジェクトに渡されたストリーム (ファイルのようなオブジェクト) を閉じる必要がありますか?
with
キーワードを使用できるようにしたいオブジェクトがあります。コンテキスト マネージャーを実装する実用性には満足していますが、ベスト プラクティスのような問題に頭を悩ませています。
オブジェクトは、ファイルのラッパーです。オブジェクトを文字列(ファイルのパス)または直接処理できるファイルのようなもので初期化することを計画しています(ファイル内にファイルが存在する可能性があるため、明確なユースケースを予測していますこれはBytesIOなどで...)
したがって、__init__
次のようになります。
_underlying_stream
だから私の質問は、私の__exit__()
機能でそれを閉じることはベストプラクティス/許容可能/賢明ですか? それがパスだったときは完全に理にかなっていますが、それが渡されたストリームである場合、閉じるのはせいぜい無礼で、最悪の場合危険だと思いますself._underlying_stream
-そう考えているのは正しいですか、もしそうなら、きちんとした方法はありますかこれ?
(注:入ってくるストリームを でラップすることを検討しましたio.BufferedReader
が、閉じると基になるストリームも閉じられることがわかりました...)
python - fabric: ヘルパー関数で cd() を扱う
ファブリックでは、cd
コンテキスト マネージャーは次のように機能します。
dir
コマンドは、ディレクトリに変更した後に実行されます。これは正常に機能しますが、問題はグローバル状態を使用することです。たとえば、cd を使用する必要があるヘルパー関数があるとします。
helper
次のような別の関数から呼び出すと
それは正常に動作します。しかし、私が次のようなことをすると
run("come command")
from ヘルパーがbar/foo
ただの代わりにfrom から実行されるようになったため、壊れfoo
ます。
これを回避する方法に関するヒントはありますか?CDで絶対パスを使用しようとしましたが、うまくいきませんでした。私が本当に欲しいのは、cd
コンテキストが関数スコープにのみ拡張されることです。
python - Python 2.6/Python 3 ニュートラルな方法でネストされたコンテキスト マネージャーのヒントはありますか?
私は、さまざまなセットアップ/ティアダウンの状況を構成するためのクリーンな方法として、多くのコンテキスト マネージャーを使用してきました。私のデプロイメントは Python 2.6 を対象としているため、これはcontextlib.nested
.
最近、同じコード ベースで Python 2.x と Python 3 の両方をサポートすることに関心があります。これは一部のプロジェクトでは可能でしたが、コンテキスト マネージャーの場合は次の理由で問題が発生しています。
contextlib.nested
Python 3 ではサポートされていません- Python-3 スタイルのネストされたコンテキスト マネージャー (例:
with aa() as a, bb() as b: ...
) は、2.6 ではサポートされていません。
ここには、基本的な構文上の非互換性があります。私の手に負えないさまざまな理由により、現時点では 2.7 を製品化するのは難しいかもしれませんが、コードを可能な限り将来的に保証したいと考えているため、Python 3 に関心があります。
2.6 と 3.x の同じコード ベースでネストされたコンテキスト マネージャーをサポートするための回避策を提案できる人はいますか? それとも、これは失われた原因ですか?
python - ブロック内にコードを関数として保存し、後でそのスコープ内で実行する
これは不可能かもしれませんが、私は次のようなものを実装しようとしています:
そのため、その with ステートメント内でブロックを取得し、そのブロックをどこかに保存して、do_thing
そのスコープを使用しながら、各関数呼び出しの前に呼び出すことができるものが必要です。
別のオプションは次のようなものです。
with ステートメントではなく。どちらのオプションも私には問題ないと思いますが、 with ステートメントが推奨されます。
ここに、私がやりたいことをするはずのものがあると思いますが、実際に試してみるとエラーが発生します。
python - with/as コンテキスト マネージャーを使用してファイルのリストを開く
注:私は知っています
構文。これは別の質問です。
文字列のリストが与えられた場合、/を使用してその中のすべてのファイル名を 1 行で開くfile_names
方法はありますか。次のようなもの:with
as
リストでコンテキストマネージャーを使用しようとするため、もちろん機能しません。リストの長さは、次のように実行時までわからない場合があります。sys.argv[1:]