問題タブ [with-statement]
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 - Pythonの「with」ステートメントは何のために設計されていますか?
with
今日初めてPythonステートメントに出くわしました。私は数ヶ月間 Python を軽く使っていましたが、その存在すら知りませんでした! ややあいまいなステータスを考えると、質問する価値があると思いました:
- 使用するように設計された Python
with
ステートメントは何ですか? - それを何のために利用しますか?
- 知っておく必要がある落とし穴や、その使用に関連する一般的なアンチパターンはありますか?
try..finally
よりも優れた使用例はありwith
ますか? - なぜもっと広く使われていないのですか?
- どの標準ライブラリ クラスと互換性がありますか?
python - 複数のコンテキストマネージャーで「with」ブロックを作成しますか?
コンテキストマネージャを介して取得する3つのオブジェクト、たとえばAロック、db接続、およびipソケットがあるとします。次の方法で取得できます。
しかし、1つのブロックでそれを行う方法はありますか?何かのようなもの
さらに、コンテキストマネージャーを持つオブジェクトの長さが不明な配列が与えられた場合、どういうわけか次のことを行うことができますか?
答えが「いいえ」の場合、そのような機能の必要性は悪いデザインを意味するのでしょうか、それとも私はそれを一言で提案する必要がありますか?:-P
sql-server-2008 - WITHステートメントはselectクエリのレコードセットをどのように保存しますか?
次のSQL(SQL Server 2008)ステートメントについて考えてみます。
MyResultはtempdbの一時テーブルに保存されていますか?それとも何か他のことをしますか?
いくつかのクエリを最適化しており、パフォーマンスなどを測定するために、WITHステートメントを(内部的に)よりよく理解する必要があります。
ありがとう
javascript - なぜevalはwithステートメントの下でスコープ変数にアクセスできないのですか?
eval
underwith
ステートメントを使用してスコープ変数にアクセスできないのはなぜですか?
例えば:
編集:知識のあるCMSが指摘したように、これはブラウザのバグ(WebKitコンソールを使用するブラウザ)のようです。
誰かが私が思いついた嫌悪感が「悪」eval
とwith
-の両方を必要とするのではないかと思っていたら、関数(コールバックとして使用)を別のコンテキストで実行できるかどうかを確認しようとしていましたで定義されました。そして、いいえ、私はおそらく(咳)これをどこにも使用しません..何よりも好奇心が強いです。
python - Python2.4でのコンテキストクラスの処理
python-daemonモジュールを使おうとしています。スクリプトを適切にデーモン化するためのdaemon.DaemonContextクラスを提供します。私は主にPython2.6以降を対象としていますが、バージョン2.4との下位互換性を維持したいと考えています。
Python 2.5はfutureからのコンテキストのインポートをサポートしていますが、Python2.4にはそのような機能はありません。withステートメントで発生したエラーをキャッチし、2.4のコンテキストを手動で開始および終了できると思いましたが、発生したSyntaxErrorをキャッチできないようです。
インタプリタのバージョンを明示的にチェックする以外に、これを達成する方法はありますか?以下は、私がやろうとしていることの要点と私が直面している問題です。実生活では、コンテキストクラスを制御できないため、元のクラスを操作せずに機能する必要があります。つまり、これらのアイデアは好きではありません。
Python2.4がpython-daemonを実行できないかどうかは気にしないでください。少なくとも、エラーをキャッチしてフォールバックなどを実装できるようにしたいと思います。
助けてくれてありがとう。
python - try-exceptブロックでpython "with"ステートメントを使用する
これは、python の "with" ステートメントを try-except ブロックと組み合わせて使用する正しい方法ですか?:
もしそうなら、物事を行う古い方法を考慮してください:
ここでの "with" ステートメントの主な利点は、3 行のコードを削除できることですか? この使用例については、私には説得力がないように思えます(ただし、「with」ステートメントには他の用途があることは理解しています)。
編集: 上記の 2 つのコード ブロックの機能は同じですか?
EDIT2:最初のいくつかの回答は、「with」を使用する利点について一般的に語っていますが、ここではわずかな利点のようです。私たちは皆、何年も f.close() を明示的に呼び出してきました (またはそうすべきでした)。ずさんなコーダーが「with」を使用することで恩恵を受けるという利点があると思います。
garbage-collection - GC 言語での RAII の (またはより適切な使用) に関する研究はありますか?
注: オブジェクト ライフタイム RAII を使用しない/ブロック スコープ RAII を使用する
追加の gc カテゴリ、短命のオブジェクト (gc カテゴリをやや頻繁にチェックする)、長命のオブジェクト (gc カテゴリをそれほど頻繁にチェックしない)、およびリソース オブジェクト (gc カテゴリを非常に頻繁にチェックする) を使用することは可能のようです。または、リソース オブジェクトの追加の参照カウント gc を使用することもできます。
using/with スタイルは、I/O のより機能的なスタイル (私が間違っていて、これが機能的なスタイルでない場合は許してください) を促進することで、いくつかの利点があるようです。オブジェクトベースの RAII の柔軟性 (簡単だから)。しかし、問題によっては、リソースの有効期間を追跡するのが難しい場合があります。
gc の複雑さと速度を回避する以外に、これが主流の言語で行われていない理由はありますか?それらの仕様では、一部のタイプのオブジェクト/またはすべてのオブジェクトの参照カウントが指定されておらず、人々が使用する他の実装には参照カウントがなく、それらの言語でのオブジェクトの有効期間 RAII の使用が制限されています。
PS:Perl に C++ タイプの RAII はありますか?
python - ステートメントマネージャーとコンテキストマネージャーでPythonを理解する
私はそのwith
声明を理解しようとしています。try
/except
ブロックを置き換えることになっていることを理解しています。
今、私がこのようなことをしたとしましょう:
これをコンテキストマネージャーに置き換えるにはどうすればよいですか?
python - 「with」ブロックで障害が発生したにもかかわらず、ファイルのコンテンツを操作する
必要なことを行うために Python でユーティリティを作成しました (関係ありませんが、社内 DSL 用の ctags 互換タグ ファイルを生成するためのものです)。
とにかく、私はステートメントのコンテキストでファイルを開いて読んでいますが、with
興味があります.人々はそのプロセスの失敗をどのように処理する傾向がありますか?
私の解決策は
ファイルを閉じて処理するのが好きなので、一致チェックを with ステートメントの外に置きました。ただし、content
ビルドされない場合、これは失敗します。
私の解決策は、content
このコードのすぐ上にある空の文字列に初期化することでしたが、私が感じたのは、関数を終了させたいということです。関数などから例外がスローされます。
この場合、残りの関数をwith
ブロックに入れることもできますが、それによって開いているファイルの範囲が広がります。障害に照らして存在するように、ブロックcontent
の前に作成できます。with
私は興味がありますが、人々が見たいと思う他の解決策は何ですか (そもそも質問に意味があると仮定して)?
私は次のようなものが好きだと思います:
それが一般的なコンセンサスである場合、私はそれに対処し、残りの機能のためにファイルを開いたままにしておく必要があるという考えを受け入れます。:)
python - Pythonのカスタムクラスで「with object() as f」の使用を実装する
Python でファイルのようなオブジェクト (/dev/ を介したシリアル接続) を開き、それを閉じる必要があります。これは、私のクラスのいくつかのメソッドで数回行われます。私がやっていた方法は、コンストラクタでファイルを開き、デストラクタでファイルを閉じることでした。私は奇妙なエラーが発生していますが、それはガベージコレクターなどに関係していると思います.オブジェクトがいつ削除されているのか正確にわからないことにまだ慣れていません=\
私がこれを行っていた理由はtcsetattr
、それを開くたびにたくさんのパラメーターを使用する必要があり、そのすべてをあちこちで行うのが面倒だからです。だから私はそれをすべて処理するために内部クラスを実装したいので、それを使用することができます
with Meter('/dev/ttyS2') as m:
私はオンラインで探していましたが、with
構文がどのように実装されているかについて本当に良い答えを見つけることができませんでした. __enter__(self)
メソッドとメソッドを使用していることがわかりました__exit(self)__
。しかし、これらのメソッドを実装する必要があり、 with 構文を使用できますか? それともそれ以上のものがありますか?
これを行う方法の例、またはファイルオブジェクトに既に実装されている方法に関するドキュメントがありますか?