2017-10-03 45 views
2

これはイディオムですか?代わりにstdoutを慣用的に使用する

with open(output_file, 'w') if output_file else sys.stdout as outf: 
    outf.write("hello") 

ウィル(それを閉じることによって)stdoutからwithブロック原因のトラブル?

+0

は、なぜあなたはそれを試してみて、 'sys.stdout.closed'かどうかを確認していませんか?ここにいくつか入力する必要はありません。 –

+0

@MaximEgorushkin確かに、私は忙しく、誰かがこれを解決するためのポイントを得ることに興味があったかもしれないと考えました。それに、私はそれがオンラインで答えを得ることは良い質問だと思う。ポイントの取引時間 - 私に何もかからない:) – dangonfast

+1

Aaaand、私はまた、人々が私が遭遇する問題をどのように解決するかを見たいと思う。 – dangonfast

答えて

4

あなたはその後標準出力に書き込みしようとした場合、それは以下となります。

>>> import sys 
>>> output_file = None 
>>> with open(output_file, 'w') if output_file else sys.stdout as outf: 
...  outf.write("hello") 
... 
hello5 
>>> print("test") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: I/O operation on closed file. 

これは何とか安全に使用することができる唯一の方法は、あなたがstdoutはならないことを知っているスクリプトの最後の文のようになり後で使用、例えば:

if __name__ == '__main__': 
    output_file = ... # parse arguments 
    with open(output_file, 'w') if output_file else sys.stdout as outf: 
     outf.write("hello") 

しかし、たとえそれが間違っている感じています。ベター:独立した開口部とは、ファイルでの作業、そしてそれについて明確にする:

if __name__ == '__main__': 
    output_file = ... # parse arguments 
    if output_file: 
     with open(output_file, 'w') as outf: 
      do_stuff(outf) 
    else: 
      do_stuff(sys.stdout) 
+0

いいですが、別のパラメータを渡しているだけなので、2つの異なる場所で 'do_stuff'を呼び出すのはちょっと奇妙なようです。私は 'outf = open(output_file、 'w')'を収集し、最後にファイル記述子を手動でクローズする: 'outf.close()'(stdoutでない場合)。もう少し書くだけですが、 'do_stuff'への一回の呼び出し – dangonfast

関連する問題