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에 특수 문법이 있으면 발전에 훨씬 큰 장벽이 생깁니다. 예를 들어, 가상의 새 printf() 함수는 print() 함수와 공존하게 된다면 그리 무리한 발상이 아닙니다.
  • 공백이 아닌 다른 구분자가 필요하거나 구분자가 아예 필요 없는 경우, 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

한편 선택적인 sep과 end 인자는 각각 인자들 사이와 인자들 뒤에 출력될 내용을 지정합니다.

softspace 기능(현재 print에게 첫 번째 항목 앞에 공백을 넣을지 여부를 알려 주는 데 쓰이는, 파일의 반쯤 비밀스러운 속성)은 제거될 것입니다. 따라서 현재의 다음 코드에 대해서는 직접적으로 대응하는 변환이 없습니다:

print "a",
print

이 코드는 "a"와 줄바꿈 사이에 공백을 출력하지 않습니다.

하위 호환성

이 PEP에서 제안하는 변경은 현재 대부분의 print 문을 유효하지 않게 만듭니다. 우연히 모든 인자를 괄호로 감싼 문장만이 버전 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 문을 모두 찾아내는 작업은 계속 진행 중입니다.

참고 문헌