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

Python 개선 제안 한국어 번역

PEP 3105 – print를 함수로 만들기

Author:
Georg Brandl <georg at python.org>
Status:
Final
Type:
Standards Track
Created:
19-Nov-2006
Python-Version:
3.0
Post-History:


Table of Contents

번역·라이선스 안내

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

초록

제목이 모든 것을 말해 줍니다 – 이 PEP는 print 문을 대체하는 새로운 print() 내장 함수를 제안하고, 새 함수에 대한 구체적인 시그니처를 제시합니다.

근거

print 문은 Guido의 “Python Regrets” 발표 자료 [1]와 같이 Python 3000에서 제거될 의심스러운 언어 기능 목록에 오랫동안 등장해 왔습니다. 따라서 이 PEP의 목적은 새로운 것이 아니지만, Python 개발자들 사이에서 큰 논쟁이 될 수도 있습니다.

print() 함수에 대한 다음 주장은 Guido 본인이 python-3000 목록에 보낸 메시지 [2]에서 정리한 것입니다.

  • print는 전용 문이 있는 유일한 애플리케이션 수준 기능입니다. Python 세계에서 구문은 일반적으로 컴파일러의 도움 없이는 무언가를 할 수 없는 경우에 최후의 수단으로 사용됩니다. Print는 그러한 예외에 해당하지 않습니다.
  • 애플리케이션을 개발하다 보면 어느 시점에 print 출력을 로깅 호출이나 다른 I/O 라이브러리 호출처럼 더 정교한 것으로 대체해야 할 필요성을 자주 느낍니다. print() 함수가 있으면 이는 간단한 문자열 치환으로 해결되지만, 오늘날에는 괄호를 모두 추가하고 >>stream 형식의 구문을 변환해야 할 수도 있어 엉망입니다.
  • print에 특수 구문을 사용하면 발전에 훨씬 큰 장벽이 생깁니다. 예를 들어 print() 함수와 함께 존재하게 될 가상의 새 printf() 함수도 충분히 가능할 수 있습니다.
  • 공백이 아닌 다른 구분자나 구분자 자체가 필요할 때 print 문을 다른 호출로 변환할 쉬운 방법이 없습니다. 또한 공백 이외의 다른 구분자를 사용하여 객체를 편리하게 출력할 방법은 전혀 없습니다.
  • print()가 함수라면 한 모듈 내부에서 (단순히 def print(*args):...를 정의하여) 또는 프로그램 전체에서 (예를 들어 __builtin__.print에 다른 함수를 넣어) 이를 대체하기가 훨씬 쉬워집니다. 현재는 write() 메서드를 가진 클래스를 작성하여 이를 sys.stdout에 할당하는 방식으로 처리할 수 있습니다 – 나쁘지는 않지만 개념적으로 훨씬 큰 도약이 분명하며, print와는 다른 수준에서 동작합니다.

사양

다양한 메일과 최근 python-3000 목록에 게시된 내용 [3]에서 가져온 print()의 시그니처는 다음과 같습니다.:

def print(*args, sep=' ', end='\n', file=None)

다음과 같은 호출은:

print(a, b, c, file=sys.stderr)

오늘날의 다음 구문과 동등합니다.:

print >>sys.stderr, a, b, c

선택적 sepend 인자는 각각 인자 사이와 인자 뒤에 무엇을 출력할지 지정합니다.

현재 파일에서 print가 첫 번째 항목 앞에 공백을 삽입할지 알려 주는 데 사용되는 반비밀 속성인 softspace 기능은 제거됩니다. 따라서 오늘날의 다음 구문에 직접 대응하는 변환은 없습니다.:

print "a",
print

이 구문은 "a"와 줄 바꿈 사이에 공백을 출력하지 않습니다.

하위 호환성

이 PEP에서 제안하는 변경 사항으로 인해 오늘날의 print 문 대부분은 유효하지 않게 됩니다. 우연히 모든 인자 주위에 괄호를 포함하는 문만 Python 3.0에서 계속 유효한 Python 구문으로 남으며, 그중에서도 괄호로 묶인 단일 값을 출력하는 문만 계속 동일하게 동작합니다. 예를 들어 2.x에서는:

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
('Hello', 'world')

반면 3.0에서는:

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
Hello world

다행히 Python 2에서 print는 문이므로 자동화된 도구로 안정적이고 모호하지 않게 탐지하고 대체할 수 있습니다. 따라서 언급한 도구를 누군가 작성한다면 주요 포팅 문제는 없을 것입니다.

구현

제안된 변경 사항은 Subversion 리비전 53685에서 53704에 걸쳐 Python 3000 브랜치에 구현되었습니다. 라이브러리의 레거시 코드 대부분도 변환되었지만, 배포본에 남아 있을 수 있는 모든 print 문을 찾아내는 작업은 계속 진행 중입니다.

참조