2017-05-19 6 views
2

원래 나는 생각했다인쇄가 쉼표를 정확히 처리하는 방법은 무엇입니까?</p> <pre><code>print "text", </code></pre> <p>거의 같은</p> <pre><code>sys.stdout.write("text" + " ") </code></pre> <p>같은 것 그러나 나는 다음과 같은 시도 :

print '(', 
sys.stdout.write("text") 
print ')' 

예상 출력 :

(text) 

또는 내가 무엇을 가지고

(text) # if the space is added by the next print statement 

:

(text) # no space at all 

사람이 동작을 설명 할 수 있습니까? 그냥 궁금해서 ...

답변

2

인쇄는 항목을 문자열로 변환 한 다음 파일 객체 (기본값 : sys.stdout)에 쓰는 것으로 구성됩니다. Python 2에서 print 문은 사용자가 쓰는 파일 객체에 소프트 공간 플래그이라는 플래그를 유지합니다. Python C API에서 file.softspace attributePyFile_SoftSpace() function을 참조하십시오.

이 플래그는 공백을 기록하는 시점을 추적하는 데 사용됩니다. 인쇄 내부적 PRINT_ opcodes 일련로 구현되고, 이들의 플래그 관리 (PRINT_ITEM 또는 PRINT_ITEM_TO)와 항목 인쇄

  • 먼저 체크 플래그가 설정되어있는 경우 공간을 작성하며, 해당 항목을 기입 한 후 out은 플래그를 다시 설정합니다.
  • 개행을 쓰는 것은 별도의 opcode (PRINT_NEWLINE 또는 PRINT_NEWLINE_TO)이며 공백을 쓰지 않고 플래그를 지 웁니다.
    >>> import sys 
    >>> if True: 
    ...  sys.stdout.softspace = 1 
    ...  sys.stdout.write('{}\n'.format(sys.stdout.softspace)) 
    ...  sys.stdout.softspace 
    ... 
    1 
    0 
    

    (나는 인터프리터를 방지하기 위해 if 블록을 사용 : 당신이 sys.stdout.write()했던 것처럼

그러나, 파일 객체 직접 쓰기, 플래그가 (쓰기를 실행하기 전에) 웁니다 중간에 프롬프트를 작성하는 루프).

그래서 이것은 당신의 예에서 일어나는 것입니다 :

  • (

    sys.stdout에 기록되고 sys.stdout.softspace이 설정됩니다.
  • sys.stdout.write('text')다시 플래그를 지우고 플래그에 대한 ), PRINT_ITEM 수표를 쓰기 전에 text
  • 을 기록,이 설정되어 있지 찾아 내고, )를 기록합니다. 플래그가 다시 설정됩니다.
  • 개행을 PRINT_NEWLINE으로 작성하고 플래그를 다시 지 웁니다.

이 모든 많은 작업은 간단한 기능을 추적하는 것입니다, 파이썬 3 인쇄에 대한 기능로 이동 이유 중 하나. PEP 3105을 참조하십시오.

+0

나는 또한 콘솔에서 시도해 보았고,'if True :'를 사용하여 즉시 모든 명령을 실행 시켰습니다.) 큰 설명에 감사드립니다! – Aemyl

+0

@Aemyl : 방금 전 진실로 생각을 털어 놓았습니다. –

+0

당신이 그것을 훔치지 않았다고해도, 당신이 원한다면 그것을 사용할 수 있다고 말했습니다. :) – Aemyl