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)\는 뒤따르는 문자의 의미를 변경하는 이스케이프입니다.

대안 제안

여러 사람이 줄 끝을 표시하는 대안적인 방법을 제안했습니다. 이러한 방법 대부분은 실제로 일을 단순화하지 못한다는 이유로 거부되었습니다.

한 가지 예외는 미완성된 표현이 줄 연속을 의미하도록 허용하는 것이었으며, 들여쓰기 수준을 높이는 것과 함께 사용할 수도 있었습니다.

이는 괄호에 대한 규칙을 일반화한 것이므로 매력적입니다.

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

  • 공백의 양은 논쟁의 여지가 있을 수 있으며, 표현식 연속을 새 스위트를 여는 것과 혼동해서는 안 됩니다.
  • “표현식 연속” 표시는 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)

연속된 줄의 들여쓰기를 첫 줄보다 더 크게 요구하면 안전성과 복잡성이 모두 증가합니다.

미해결 문제

  • 문자열 내부에서도 \-연속을 제거해야 합니까?
  • 연속 표시를 ([{}])에서 연산자로 끝나는 줄까지 확장해야 합니까?
  • 안전 조치로서 연속된 줄의 들여쓰기를 첫 줄보다 더 크게 요구해야 합니까?

참고 문헌