2017-10-28 4 views
2

Pythonクラスではメソッドがファイルをオープンしましたが、ファイルオブジェクトを実際に使用する別のメソッドです。だから私は書く:with ... fromのステートメントをself.barに割り当てる

def first_method(self): 
    with open(FILE) as f: 
     self.output = f 
     self.another_method() 

def another_method(self): 
    self.output.write(DATA) 

ご覧のとおり、another_methodwith ... as範囲にfirst_methodによって呼び出されるので、私はanother_methodwith ... asスコープを終了first_method前に行われることを確信しているされて - それは動作します。しかし、私はこのラインについて困惑してる:

self.output = f 

は、別の関数でwith ... asのステートメントからの結果を使用することをお勧めしますか?これは予期せぬ動作や制御不能な動作につながりますか?

そして、another_methodは、fが使用される唯一の場所ではありません。実際には、another_methodはコルーチンで、多くはfに非同期で書き込みます。だから私はanother_method以外のファイルを開く必要があります。

aiohttp.ClientSession,tqdm.tqdmのように、同じ問題に直面している他の多くのコンテキストマネージャがあります。それらをパラメータとして渡すと、パラメータが多すぎます。

実際には、thisと書くと問題が発生します。

+0

@ PM2Ringありがとう、私は質問を編集しました。 – CSM

答えて

2

withステートメントは、ブロックの最後にオブジェクトの__exit__メソッドを自動的に実行します。 __exit__の後にオブジェクトがまだ参照を持っていても使用できない状態になっていると仮定することは妥当です。それをオブジェクト属性として保存することは、お勧めできません。

具体的な例では、ファイルを明示的にパラメータとしてanother_methodに渡す方がよいでしょう。

+0

これ。 'another_method'が' f'が使用される唯一の場所であれば、おそらくファイル自体を開くべきです。 –

+0

ファイルをパラメータとして渡すことを検討しましたが、パラメータが多すぎます。 – CSM

+0

@CSMでは、あるパラメータをメソッドに追加することが突然「あまりにも多く」に変わることはわかりません。あなたはあなたの疑問に少しでもそれを広げることができますか? –

関連する問題