私は2つのパラメータを返す関数f
を持っています。この関数の後、私は最初のパラメータを使います。別の機能と一緒に物を接着するために2番目のものが必要ですg
。だから私のコードは次のようになります。withステートメント内の関数呼び出しを隠す
a, b = f()
# do stuff with a
g(b)
これは非常に反復的であるので、私は、私はRAIIのアプローチのようなものを使用することができます考え出しました。
with F() as a:
# do stuff with a
ことだ:私はオブジェクトが死んでしまうときがわからないと、私の主な目標は、反復コードを取り除くことであるので、しかし、私はwith
ステートメントを使用していました。私は基本的に、__enter__
と__exit__
関数(と明らかに__init__
関数)を提供するこの関数の周りにオブジェクトF
を作成しました。
しかし、これを処理するための正しいPythonの方法であるかどうかはまだ分かりません。with
ステートメントは例外を処理するためのものだったからです。特にこの__exit__
関数には3つの引数がありますが、私は現時点では使用していません。
編集(更なる説明): 私はf()
を呼び出すたびに、私はb
で何かをする必要があります。間に何が起こったかは関係ありません。私はg(b)
と表現しました。そして、まさに私はwithステートメントで隠れています。だからプログラマは、f()
の呼び出しのたびにg(b)
と入力する必要はありません。#do stuff with a
は長くなるかもしれないので、非常に混乱し混乱するかもしれません。
* *それは非常に反復的ですか?問題が何であるか、コンテキストマネージャが最善の解決策であると考えた理由は明確ではありません。あなたがそのコードをたくさん使っているなら、パラメータを 'a'と' b'の関数にしてください。途中のビットが変更された場合、それを抽出できないと思うので、 'g'を呼び出す前に' a'で呼び出す関数である新しいパラメータを追加します(関数はPythonではファーストクラスです)。あなたが達成しようとしているもののあまり抽象的な例を教えてください。 'g' * do *とは何ですか? – jonrsharpe
それは正確にどのように繰り返しているのか説明できますか?また、with文で 'b'をどのように使用していますか?個人的には、リソースのように見えるものには 'with'を使用する方が好きです。もう1つの方法はデコレータを使用する方法です。 – SuperSaiyan
「g」とは何ですか?例外がスローされた場合でもそれは起こるはずですか?それが起こらないようにするには、別の種類のクリーンアップが代わりに行われるべきですか? – user2357112