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

Python 개선 제안 한국어 번역

PEP 3125 – 백슬래시 줄 이어짐 제거

Author:
Jim J. Jewett <JimJJewett at gmail.com>
Status:
Rejected
Type:
Standards Track
Created:
29-Apr-2007
Post-History:
29-Apr-2007, 30-Apr-2007, 04-May-2007

Table of Contents

번역·라이선스 안내

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

거부 공지

이 PEP는 거부되었습니다. 찬성하는 지지가 충분하지 않았고, 제거하려는 기능이 그다지 해롭지 않으며, 오히려 더 어려워지는 사용 사례도 있습니다.

초록

Python은 처음에 C로부터 구문 분석 방식을 물려받았습니다. 이는 대체로 유용했지만, Python에는 그다지 유용하지 않은 잔재도 일부 남아 있으며, 이러한 잔재는 제거되어야 합니다.

이 PEP는 줄 이어짐 표시로 쓰이는 줄 끝 \의 제거를 제안합니다.

동기

Python 3000의 목표 중 하나는 불필요하거나 중복된 기능을 제거하여 언어를 단순화하는 것이어야 합니다. 현재 논리적 줄이 다음 물리적 줄로 이어진다는 것을 나타내는 방법이 여러 가지 있습니다.

다른 줄 이어짐 방법은 그 방법이 제공하는 의미의 논리적 귀결로 쉽게 설명되지만, \는 단순히 외워야 하는 이스케이프 문자일 뿐입니다.

기존의 줄 이어짐 방법

괄호 표현식 - ([{}])

괄호 표현식을 엽니다. 사람들이 이를 “줄”이 이어지는 것으로 보는지는 중요하지 않습니다. 사람들은 문장이 끝나기 전에 표현식을 닫아야 한다는 것을 즉시 알아차립니다.

(), [], {} 각각을 사용한 예:

def fn(long_argname1,
       long_argname2):
    settings = {"background": "random noise",
                "volume": "barely audible"}
    restrictions = ["Warrantee void if used",
                    "Notice must be received by yesterday",
                    "Not responsible for sales pitch"]

표현식은 언제나 괄호로 감쌀 수 있지만, 줄 바꿈 때문에만 괄호가 필요한 표현식을 괄호로 감싸는 것은 어색해 보일 수 있다는 점에 유의하십시오:

assert val>4, (
    "val is too small")

삼중 따옴표 문자열

삼중 따옴표 문자열을 엽니다. 이 경우에도 사람들은 다음 문장이 시작되기 전에 문자열이 끝나야 한다는 것을 알아차립니다.

banner_message = """
    Satisfaction Guaranteed,
    or DOUBLE YOUR MONEY BACK!!!





                                    some minor restrictions apply"""

일반적인 경우의 줄 끝 \

줄 끝의 \는 논리적 줄이 (공백 다음의) 다음 물리적 줄로 이어진다는 것을 나타냅니다. 여기에는 특별한 의미가 연관되어 있지 않습니다. 이 형식이 꼭 필요한 경우는 없지만, 어떤 경우에는 (특히 C 언어 배경을 가진 사람들에게) 더 보기 좋을 수도 있습니다:

>>> assert val>4, \
        "val is too small"

또한 \는 반드시 줄의 마지막 문자여야 한다는 점에 유의하십시오. 편집기에서 커서를 이동하다가 줄 끝에 공백이 추가될 수 있다면, 그 보이지 않는 변경이 프로그램의 의미를 바꾸게 됩니다. 다행히 일반적인 결과는 런타임 버그가 아니라 문법 오류일 뿐입니다:

>>> assert val>4, \
        "val is too small"

SyntaxError: unexpected character after line continuation character

이 PEP는 이처럼 중복되고 혼란을 줄 수 있는 대안을 제거할 것을 제안합니다.

문자열 안의 줄 끝 \

삼중 따옴표가 아닌 문자열 안에서 줄 끝에 오는 \입니다. 이는 줄 끝 \의 특수한 경우라고 볼 수도 있지만, 유지할 가치가 있을 수도 있는 특수한 경우입니다.

>>> "abd\
 def"
'abd def'
  • 찬성: \로 줄을 끝맺는 방식의 제거에 대한 반대 의견 중 상당수는 사실 리터럴 문자열 안에서 이를 제거하는 데 대한 반대였습니다. 여러 사람이 이 리터럴 문자열 용법은 유지하고 싶지만 일반적인 경우는 없어져도 상관없다고 분명히 밝혔습니다.
  • 찬성: 문자열 안에서 \를 이스케이프 문자로 사용하는 방식은 잘 알려져 있습니다.
  • 반론: 하지만 이 특정한 용법은 이상하다는 점에 유의하십시오. 이스케이프되는 문자(줄바꿈)는 보이지 않고, 그 특수한 처리는 해당 문자를 삭제하는 것이기 때문입니다. 그렇다 하더라도 \(newline)의 \는 여전히 뒤따르는 문자의 의미를 바꾸는 이스케이프입니다.

대안 제안

여러 사람이 줄 끝을 표시하는 다른 방법을 제안했습니다. 이들 대부분은 실제로 문제를 단순화하지 못한다는 이유로 기각되었습니다.

유일한 예외는 끝나지 않은 표현식이면 무엇이든 줄 이어짐을 나타내도록 하는 방안이었으며, 들여쓰기 증가와 함께 적용될 수도 있었습니다.

이 방안은 괄호에 대한 규칙을 일반화한 것이라는 점에서 매력적입니다.

이에 대한 초기 반론은 다음과 같았습니다:

  • 공백의 양은 논란의 여지가 있을 수 있습니다. 표현식 이어짐을 새로운 스위트(suite)의 시작과 혼동해서는 안 됩니다.
  • Python에서 “표현식 이어짐” 표시는 그룹화 구두점인 “(), [], {}” 표시만큼 명확하게 드러나지 않습니다:
    # Plus needs another operand, so the line continues
    "abc" +
        "def"
    
    # String ends an expression, so the line does not
    # not continue.  The next line is a syntax error because
    # unary plus does not apply to strings.
    "abc"
        + "def"
    
  • Guido는 기술적인 이유로 반대했습니다. [1] 가장 직관적인 구현은 INDENT 또는 DEDENT 토큰을 어디에서나, 또는 적어도 크게 확장된(그리고 정의가 불분명한) 위치 집합에서 허용해야 합니다. 이는 (사용자가 아닌) 내부 구문 분석 메커니즘에만 관련된 문제이지만, 복잡성을 크게 늘리는 새로운 원인이 될 것입니다.

이후 Andrew Koenig가 더 나은 구현 전략을 제시하면서 [2] 그 전략이 다른 언어에서 꽤 잘 작동했다고 말했습니다. [3] 개선된 제안의 요점은 다음과 같습니다:

(연산자나) 여는 대괄호 또는 괄호 뒤에 오는 공백에는 줄바꿈 문자가 포함될 수 있습니다.

이는 매우 낮은 어휘 수준에서 구현될 것입니다 – 줄바꿈 뒤에 공백이 오는 것을 INDENT 토큰이나 DEDENT 토큰으로 바꿀지 결정하기도 전에 말입니다.

다음 예에서처럼 버그를 가릴 수 있다는 우려는 여전히 남아 있습니다 [4]:

# Used to be y+1, the 1 got dropped.  Syntax Error (today)
# would become nonsense.
x = y+
f(x)

이어지는 줄을 첫 줄보다 더 들여 쓰도록 요구하면 안전성과 복잡성이 모두 늘어납니다.

미해결 문제

  • 문자열 안에서도 \-이어짐을 제거해야 합니까?
  • 이어짐 표시를 ([{}])에서 연산자로 끝나는 줄까지 포함하도록 확장해야 합니까?
  • 안전 조치로서, 이어지는 줄을 첫 줄보다 더 들여 쓰도록 요구해야 합니까?

참고 문헌