Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 259 – 줄바꿈 뒤의 줄바꿈 출력 생략

Author:
Guido van Rossum <guido at python.org>
Status:
Rejected
Type:
Standards Track
Created:
11-Jun-2001
Python-Version:
2.2
Post-History:
11-Jun-2001

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

현재 print 문은 끝에 쉼표를 붙이지 않는 한 항상 줄바꿈을 덧붙입니다. 따라서 이미 줄바꿈으로 끝나는 데이터를 출력하면 특별히 조치하지 않는 한 줄바꿈이 두 번 출력됩니다.

데이터에서 나온 줄바꿈 바로 뒤에 오는 줄바꿈은 출력하지 않을 것을 제안합니다.

파일 객체에 매직 변수를 또 하나 추가하지 않기 위해, 기존 ‘softspace’ 변수에 의미를 하나 더 부여할 것을 제안합니다. 음수 값은 “마지막으로 쓴 데이터가 줄바꿈으로 끝났으므로 공백 또는 줄바꿈이 필요하지 않다”는 뜻이 됩니다.

문제

파일에서 읽은 줄과 비슷한 데이터를 단순한 루프로 출력하면 특별히 주의하지 않는 한 줄 간격이 두 배가 됩니다.:

>>> for line in open("/etc/passwd").readlines():
... print line
...
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:

daemon:x:2:2:daemon:/sbin:

(etc.)

>>>

쉬운 우회 방법이 있지만 이 문제는 테스트 중에야 발견되는 경우가 많아 편집과 테스트를 한 번 더 거쳐야 합니다. 게다가 수정한 코드는 더 보기 흉하고 유지 보수하기도 더 어렵습니다.

제안하는 해결책

ceval.c의 PRINT_ITEM 옵코드는 문자열 객체를 출력할 때 이미 그 문자열의 마지막 문자를 검사합니다. 현재는 마지막 문자가 스페이스가 아닌 화이트스페이스 문자이면 softspace 플래그를 0으로 초기화합니다. 그래서 첫 번째 항목이 줄바꿈, 탭 등으로 끝나는 문자열이면 두 항목 사이에 공백이 출력되지 않습니다(스페이스로 끝나는 경우는 제외합니다). 그 밖의 경우에는 softspace 플래그를 1로 설정합니다.

이 제안은 이 검사를 조금 바꾸어 softspace를 다음과 같이 설정합니다.

  • -1 – 마지막으로 쓴 객체가 줄바꿈으로 끝나는 문자열인 경우
  • 0 – 마지막으로 쓴 객체가 스페이스도 줄바꿈도 아닌 공백 문자로 끝나는 문자열인 경우
  • 1 – 그 밖의 모든 경우(마지막으로 쓴 객체가 빈 문자열이거나 문자열이 아닌 경우를 포함합니다)

그리고 PRINT_NEWLINE 옵코드는 softspace 값이 음수이면 줄바꿈을 출력하지 않습니다. 어느 경우든 softspace 플래그는 0으로 초기화됩니다.

범위

이 변경은 8비트 문자열 출력에만 영향을 줍니다. 유니코드에는 영향을 주지 않지만, 이는 유니코드 구현의 버그로 볼 수도 있습니다. 문자열 표현이 우연히 줄바꿈 문자로 끝나는 다른 객체에는 영향을 주지 않습니다.

위험 요소

이 변경으로 기존 코드 일부가 제대로 동작하지 않게 됩니다. 예를 들어 다음과 같습니다.:

print "Subject: PEP 259\n"
print message_body

현재 Python에서는 이 코드가 제목과 메시지 본문 사이에 빈 줄을 만들어 둘을 구분하지만, 제안된 변경 사항을 적용하면 본문이 제목 바로 아래에서 시작합니다. 어차피 이 코드는 그다지 견고하지 않으며, 다음과 같이 작성하는 편이 더 좋습니다.:

print "Subject: PEP 259"
print
print message_body

테스트 스위트에서는 이 기능을 명시적으로 테스트하는 test_StringIO만 실패합니다.

구현

현재 CVS 기준 패치는 여기에 있습니다.:

http://sourceforge.net/tracker/index.php?func=detail&aid=432183&group_id=5470&atid=305470

거부됨

사용자 커뮤니티가 만장일치로 이를 거부했으므로, 이 아이디어는 더 이상 추진하지 않겠습니다. 자주 들은 반대 인자는 다음과 같습니다:

  • 수천 개의 CGI 스크립트가 동작하지 않게 될 가능성이 높습니다.
  • 마법은 이미 충분합니다(그리고 ‘print’를 더 이상 손대지 말아 주십시오).