PEP 515 – 숫자 리터럴의 밑줄
- Author:
- Georg Brandl, Serhiy Storchaka
- Status:
- Final
- Type:
- Standards Track
- Created:
- 10-Feb-2016
- Python-Version:
- 3.6
- Post-History:
- 10-Feb-2016, 11-Feb-2016
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
추상적 배경 및 근거
이 PEP는 정수, 부동 소수점 및 복소수 리터럴에서 숫자 그룹화를 위한 시각적 구분자로 밑줄을 사용할 수 있도록 Python의 구문과 문자열에서 숫자를 생성하는 생성자를 확장할 것을 제안합니다.
이는 다른 현대적인 언어에서 흔히 제공되는 기능이며, 긴 리터럴이나 16진수 표기에서 바이트 또는 단어처럼 값이 명확하게 부분으로 나뉘어야 하는 리터럴의 가독성을 높이는 데 도움이 될 수 있습니다.
예제:
# grouping decimal numbers by thousands
amount = 10_000_000.0
# grouping hexadecimal addresses by words
addr = 0xCAFE_F00D
# grouping bits into nibbles in a binary literal
flags = 0b_0011_1111_0100_1110
# same, for string conversions
flags = int('0b_1111_0000', 2)
명세
현재 제안은 숫자 리터럴에서 숫자 사이와 진법 지정자 뒤에 밑줄 하나를 허용하는 것입니다. 밑줄은 의미론적 의미를 갖지 않으며, 리터럴은 밑줄이 없는 것처럼 구문 분석됩니다.
리터럴 문법
따라서 정수 리터럴의 생성 규칙 목록은 다음과 같이 보이게 됩니다.:
integer: decinteger | bininteger | octinteger | hexinteger
decinteger: nonzerodigit (["_"] digit)* | "0" (["_"] "0")*
bininteger: "0" ("b" | "B") (["_"] bindigit)+
octinteger: "0" ("o" | "O") (["_"] octdigit)+
hexinteger: "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit: "1"..."9"
digit: "0"..."9"
bindigit: "0" | "1"
octdigit: "0"..."7"
hexdigit: digit | "a"..."f" | "A"..."F"
부동 소수점 및 복소수 리터럴의 경우:
floatnumber: pointfloat | exponentfloat
pointfloat: [digitpart] fraction | digitpart "."
exponentfloat: (digitpart | pointfloat) exponent
digitpart: digit (["_"] digit)*
fraction: "." digitpart
exponent: ("e" | "E") ["+" | "-"] digitpart
imagnumber: (floatnumber | digitpart) ("j" | "J")
생성자
배치에 동일한 규칙을 적용하여 다음 생성자에서 밑줄을 허용합니다.
int()(모든 진법에서)float()complex()Decimal()
추가 변경 사항
새로운 방식의 숫자-문자열 서식 지정 언어가 확장되어 천 단위 구분자로 _를 허용합니다. 현재는 ,만 지원됩니다. 이를 사용하면 더 읽기 쉬운 리터럴을 포함하는 코드를 쉽게 생성할 수 있습니다. [11]
구문은 쉼표의 경우와 동일합니다. 예를 들어 너비가 10이고 _를 구분자로 사용하는 경우에는 {:10_}와 같이 작성합니다.
b, x 및 o 형식 지정자에서는 _를 허용하며 4자리씩 그룹화합니다.
선행 사례
밑줄 그룹화를 허용하는 언어들은 밑줄 배치 규칙에서 매우 다양한 방식을 구현합니다. 언어 명세가 실제 동작과 모순되는 경우에는 실제 동작을 나열합니다. (“single” 또는 “multiple”은 연속된 밑줄의 반복을 허용하는지를 나타냅니다.)
- Ada: 단일 밑줄, 숫자 사이에서만 허용 [8]
- C# (7.0을 위한 공개 제안): 여러 밑줄, 숫자 사이에서만 허용 [6]
- C++14: 단일 밑줄, 숫자 사이에서 허용됨 (다른 구분자 선택) [1]
- D: 여러 밑줄, 끝을 포함하여 어디에서나 허용 [2]
- Java: 여러 밑줄, 숫자 사이에서만 허용 [7]
- Julia: 단일 밑줄, 숫자 사이에서만 허용됨 (단, 부동 소수점 지수 부분에서는 허용되지 않음) [9]
- Perl 5: 여러 밑줄, 기본적으로 어디에서나 허용되지만 문서에서는 숫자 사이에 밑줄 하나로 제한된다고 설명함 [3]
- Ruby: 하나만 허용되며 숫자 사이에서만 사용할 수 있습니다(문서에서는 “어디서나”라고 설명하지만) [10]
- Rust: 여러 개를 사용할 수 있으며 어디서나 가능하지만, 지수의 “e”와 숫자 사이에서는 사용할 수 없습니다 [4]
- Swift: 여러 개를 사용할 수 있으며 숫자 사이와 끝에 사용할 수 있습니다(문서 설명에서는 “숫자 사이에서만”이라고 하지만) [5]
대체 구문
밑줄 배치 규칙
위에서 지정한 비교적 엄격한 규칙 대신 밑줄 사용을 덜 제한할 수 있습니다. 다른 언어에서 볼 수 있듯이 일반적인 규칙은 다음과 같습니다.
- 연속된 밑줄은 하나만 허용하며, 숫자 사이에서만 사용할 수 있습니다.
- 연속된 밑줄을 여러 개 사용할 수 있지만, 숫자 사이에서만 사용할 수 있습니다.
- 연속된 밑줄을 여러 개 사용할 수 있으며, 리터럴의 시작 부분이나 소수점 뒤와 같은 특수한 위치를 제외한 대부분의 위치에서 사용할 수 있습니다.
이 PEP의 구문은 일반적인 사용 사례를 포괄하면서도 스타일 가이드에서 금지해야 할 구문을 허용하지 않기 때문에 최종적으로 선택되었습니다.
덜 일반적인 규칙으로는 N자리마다 밑줄을 허용하는 방법이 있습니다(N은 십진 리터럴의 경우 3, 16진 리터럴의 경우 4가 될 수 있습니다). 구분자 배치가 문화권마다 다르다는 점을 고려하면 이는 불필요하게 제한적입니다.
다른 구분자
공백을 그룹화에 사용하는 대체 구문이 제안되었습니다. 문자열에서는 인접한 리터럴을 결합하는 선례가 있지만, 이 동작은 밑줄을 사용할 때는 발생할 수 없는 예기치 않은 결과를 초래할 수 있습니다. 또한 일반적으로 모든 공백을 무시하는 언어를 제외하면 이러한 규칙을 사용하는 다른 언어는 알려져 있지 않습니다.
C++14에서는 그룹화를 위해 아포스트로피를 도입했지만(밑줄은 사용자 정의 리터럴과 모호성을 일으키기 때문입니다), Python 문자열 리터럴에서 이미 사용되고 있으므로 고려하지 않습니다. [1]
구현
위에 제시된 사양을 구현하는 예비 패치가 이슈 트래커에 게시되었습니다. [12]
참고 자료
Copyright
This document has been placed in the public domain.