2017-03-12 11 views
1

verbose_print 명령을 사용하여 콘솔에 출력을 로깅하는 오픈 소스 파이썬 라이브러리에서 작업하고 있습니다. 현재는 다음과 같습니다 (!이 고정 보너스 포인트) 그 외에도 파이썬이 실패한다는 사실에서 `stdout.flush`가없는 콘솔에서는`print()`가 지연됩니까?

def verbose_print(verbose, *args): 
    """ Prints everything passed execpt the first arguement if verbose is True.""" 
    if verbose: 
     print(*args) 

, 내가 생각 :
def sys_write_flush(s): 
    """ Writes and flushes without delay a text in the console """ 
    sys.stdout.write(s) 
    sys.stdout.flush() 


def verbose_print(verbose, s): 
    """ Only prints s (with sys_write_flush) if verbose is True.""" 
    if verbose: 
     sys_write_flush(s) 

내가 다음과 같습니다 변경을 제안 이것은 더 좋고 더 관용적 일 것입니다. 첫 번째 인수는 True 또는 False이어야한다는 점만 제외하면 verbose_print을 정확히 print과 같이 처리 할 수 ​​있다는 장점이 있습니다.

그 일부 콘솔에서 (그리고 IPython 노트북에서, 적어도 당시) 나는이 일을 문서화해야하지만, 기본적으로 문제가 있었다

, :

되찾기 소유자는이 메시지에 대답 stdout.flush가 순간적으로 나타나는 반면 "print"명령은 지연됩니다. 따라서 내 방법이 피드백을 제공하는 것이 더 낫습니다.

알려진 문제가 해결되지 않으면 인쇄를 변경하는 것이 좋습니다.

여전히 유효한 문제입니까? print() 다음에 sys.stdout.flush()이 오는 것이 지연을 피하겠습니까? 이것을 작성하는 더 좋은 방법이 있습니까? 워드 프로세서

Source

답변

1

인용구 :

print 차례로 각 식을 계산하고 표준 출력으로 생성 오브젝트를 기록한다.

표준 출력이 내장 모듈 sysstdout라는 파일 오브젝트로서 정의된다. 그러한 개체가 없거나 에 write() 메서드가없는 경우 RuntimeError 예외가 발생합니다.

이에 따르면, print은 예, sys.stdout.flush()print 후 ING을하는 것은 sys.stdout.write -ing 후 보내고 flush과 같은 영향을 미칠 것입니다, sys.stdout에 기록 때문에.


print 함수가 아니기 때문에 print(*a) 파이썬이 실패 구문하지만 , 그 fun(*stuff) 구조는 기능에만 적용됩니다.파이썬에서

aprint 별도의 인수로 , 그러나 이것은 큰 문자열 전달과 동일 함수에 포함되어 무엇이든 3 개 print(*a) 패스 :

separator = ' ' 
print separator.join(map(str, iterable)) 

그래서, 당신의 코드는 다음과 같이 수 :

def verbose_print(verbose, *args): 
    """ Prints everything passed except the first arguement if verbose is True.""" 
    if verbose: 
     print " ".join(map(str, args)) 
     sys.stdout.flush() 

원본보다 왜 더 빠르고 읽기 쉬운지 알 수는 없지만.