[解決済み】複数のコンテキストマネージャで "with "ブロックを作成する?[重複している]。
質問
例えば、ロック、データベース接続、IPソケットの3つのオブジェクトをコンテキストマネージャで取得するとします。 これらを取得するには、次のようにします。
with lock:
with db_con:
with socket:
#do stuff
しかし、それを1つのブロックにする方法はありますか?
with lock,db_con,socket:
#do stuff
さらに、コンテキスト・マネージャーを持つオブジェクトの長さ不明の配列が与えられた場合、どうにかしてそれを行うことは可能でしょうか。
a=[lock1, lock2, lock3, db_con1, socket, db_con2]
with a as res:
#now all objects in array are acquired
もし答えが「いいえ」なら、そのような機能の必要性が悪いデザインを意味するからでしょうか? それとも、激励で提案すべきでしょうか?
解決方法は?
で Python 2.7および3.1以上 と、書くことができます。
with A() as X, B() as Y, C() as Z:
do_something()
通常はこの方法が最適ですが、コンテキストマネージャーのリストが未知の長さである場合は、以下の方法のいずれかが必要です。
で Python 3.3 を使用すると、コンテキスト・マネージャの長さが不明なリストを入力することができます。 contextlib.ExitStack :
with ExitStack() as stack:
for mgr in ctx_managers:
stack.enter_context(mgr)
# ...
これにより、コンテキストマネージャーを追加する際に
ExitStack
で起こりうる問題を防ぐことができます。
contextlib.nested
(後述)。
contextlib2
提供する
のバックポートです。
ExitStack
Python 2.6 と 2.7 用。
で
Python 2.6 およびそれ以下
を使用することができます。
contextlib.nested
:
from contextlib import nested
with nested(A(), B(), C()) as (X, Y, Z):
do_something()
とは等価である。
m1, m2, m3 = A(), B(), C()
with m1 as X:
with m2 as Y:
with m3 as Z:
do_something()
これは、通常、ネストされた
with
なぜなら
A()
,
B()
および
C()
はすべて、コンテキストマネージャに入る前に最初に呼び出されます。これらの関数のいずれかが例外を発生させた場合、正しく動作しません。
contextlib.nested
は新しいバージョンのPythonでは非推奨で、上記のメソッドが採用されています。
関連
-
Python jiabaライブラリの使用方法について説明
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] リスト内包型辞書の作成
-
[解決済み] Pythonで複数行のコメントを作成する方法はありますか?
-
[解決済み] Pythonで定数を作成するにはどうすればよいですか?
-
[解決済み] with文の中に複数の変数がある?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] with文の中に複数の変数がある?
-
[解決済み] Pythonでファイル内の行を検索して置換する