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.cPRINT_ITEM opcode에서는 문자열 객체를 출력할 때 해당 문자열의 마지막 문자를 확인하는 검사가 이미 수행됩니다. 현재 마지막 문자가 공백 이외의 공백 문자이면 softspace 플래그가 0으로 재설정됩니다. 이로 인해 첫 번째 항목이 개행, 탭 등으로 끝나는 문자열일 때 두 항목 사이의 공백이 억제됩니다(공백으로 끝나는 경우에는 억제되지 않습니다). 그 밖의 경우에는 softspace 플래그가 1로 설정됩니다.

이 제안에서는 이 검사를 약간 변경하여 softspace를 다음과 같이 설정합니다.

  • -1 – 마지막으로 기록된 객체가 개행으로 끝나는 문자열인 경우
  • 0 – 마지막으로 기록된 객체가 공백도 개행도 아닌 공백 문자로 끝나는 문자열인 경우
  • 1 – 그 밖의 모든 경우(마지막으로 기록된 객체가 빈 문자열이거나 문자열이 아닌 경우를 포함)

그런 다음 PRINT_NEWLINE opcode에서는 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’를 만지작거리지 말아 주십시오).