2017-10-03 5 views
2

이 관용적입니까?대안으로 stdout의 관용적 사용

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

윌 (를 닫아) stdoutwith 블록 원인이 문제?

+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

다른 매개 변수를 전달하기 때문에 두 개의 다른 장소에서'do_stuff'를 호출하는 것은 좋지 않습니다. 나는 아마도'outf = open (output_file, 'w')'을 수집 할 것이고, 마지막에는 수동으로 파일 디스크립터를 닫을 것이다 :'outf.close()'(stdout이 아닌 경우). 조금 더 쓰지 만'do_stuff'에 대한 한 번의 호출 – dangonfast

관련 문제