2017-03-13 9 views
2

한다고 가정 우리는 다음과 같은 더미 기능을 가지고 :sys.stdout

import sys 

def writeline(text, stream=sys.stdout): 
    stream.write(text + '\n') 

with open('/path/to/file', 'w') as f: 
    # writes to /path/to/file 
    writeline('foo', f) 

# writes to standard output 
writeline('bar') 

파이썬은 기본 인수를 안전뿐만 sys.stdout을 설정하고, 정의시 기능에 대한 기본 인수를 평가하거나 의도하지 않은 가질 수 있음을 감안할 때 부작용?

+1

당신이 [일시적으로 리디렉션'클라이언트 코드 내에서 stdout'] 있습니다하지 않는 한 (http://stackoverflow.com/questions/6796492/temporarily-redirect- stdout-stderr), 괜찮을 겁니다. 이 리디렉션을 원할 경우 함수는 여전히 원래 stdout에 대한 참조를 보유하므로 리디렉션이 작동하지 않습니다. –

답변

3

내가 생각하는 문제는 가끔 sys.stdout을 파일 (또는 파이프, 장치 등)으로 리디렉션하려는 경우입니다. 하나 (같은이 python3 file.py logfile.log를) 언급하는 경우 파일에 로그에 프로그램을하려는 경우에 유용 할 수

if __name__ == '__main__': 
    if len(sys.argv) > 1: 
     sys.stdout = open(sys.argv[1],'w') 
    try: 
     # ... run the program 
    finally: 
     if len(sys.argv) > 1: 
      sys.stdout.close() 

:

예를 들어 메인 프로그램처럼 보일 수 있습니다. 이제 sys.stdout을 설정 했으므로 해당 수정 사항은 writeline 메소드에 표시되지 않습니다.

그러므로 나는 그것을 쓰는 것이 더 안전하다고 생각 : 일반적으로

def writeline(text, stream= None): 
    if stream is None: 
     stream = sys.stdout 
    stream.write(text + '\n')

은 아마 기본 매개 변수로 불변 객체 (같은 None, False, (1,) 등)을 설정하는 좋은 조언이다. 희소 한 경우에만 불변의 것들 (또는 참조를 변경할 수도있는 것들)이 파이썬에서 의도적으로 사용됩니다.

그러나 sys.stdout을 파일, 파이프 등으로 리디렉션하지 않는 것이 확실한 경우 안전합니다.

+0

좋은 지적. _immutable_ 개체를 기본 매개 변수로 설정하는 것이 더 나은 이유를 알고 있지만,'sys.stdout' 자체가 변경 될 가능성을 고려하지 않았기 때문에이 경우에는 필요하지 않다고 생각했습니다. – farsil

1

가장 자주 명명 된 인수의 일정 가치에 대해 의심이있을 때 사용되는 관용구는 None에 인수를 설정하는 것입니다, 그래서 해상도는 항상 호출시에 현재있는 값에 대한 런타임에 수행됩니다

def writeline(text, stream=None): 
    if stream is None: 
     stream = sys.stdout 
    stream.write(text + '\n') 
0

file 인수가 None 출력은 평소와 같이 stdout에 인쇄 할 경우 당신은, 파이썬 3의 인쇄 기능을 사용하는 경우. 그래서 당신은 너무 같은 기본 값 None을 만들 수 있습니다

def write_something(items, outfile=None): 
    for item in items: 
     print(item, file=outfile)