prosource

파이썬 3은 0에 대해 "00"을 리터럴로 허용하지만 1에 대해 "01"을 리터럴로 허용하지 않는 이유는 무엇입니까?

probook 2023. 5. 3. 21:31
반응형

파이썬 3은 0에 대해 "00"을 리터럴로 허용하지만 1에 대해 "01"을 리터럴로 허용하지 않는 이유는 무엇입니까?

파이썬 3은 0에 대해 "00"을 리터럴로 허용하지만 1에 대해 "01"을 리터럴로 허용하지 않는 이유는 무엇입니까?좋은 이유가 있습니까?이러한 불일치는 저를 당황스럽게 합니다. (그리고 우리는 일관성과 같은 목표를 달성하기 위해 의도적으로 하위 호환성을 깬 Python 3에 대해 이야기하고 있습니다.)

예:

>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
  File "<stdin>", line 1
    time(16, 01)
              ^
SyntaxError: invalid token
>>>

https://docs.python.org/3/reference/lexical_analysis.html#integer-literals 단위:

정수 리터럴은 다음과 같은 어휘 정의로 설명됩니다.

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"+
nonzerodigit   ::=  "1"..."9"
digit          ::=  "0"..."9"
octinteger     ::=  "0" ("o" | "O") octdigit+
hexinteger     ::=  "0" ("x" | "X") hexdigit+
bininteger     ::=  "0" ("b" | "B") bindigit+
octdigit       ::=  "0"..."7"
hexdigit       ::=  digit | "a"..."f" | "A"..."F"
bindigit       ::=  "0" | "1"

사용 가능한 메모리에 저장할 수 있는 것을 제외하고 정수 리터럴의 길이에는 제한이 없습니다.

0이 아닌 10진수에서는 선행 0을 사용할 수 없습니다.이는 Python이 버전 3.0 이전에 사용한 C 스타일 팔각 리터럴과의 명확성을 위한 것입니다.

여기에 명시된 것처럼 0이 아닌 소수점 이하의 선행 0은 허용되지 않습니다. "0"+Python 2에는 없었던 매우 특별한 경우로서 합법적입니다.

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit+ | "0" octdigit+

SVN 커미셔너 55866은 토큰화기에 PEP 3127을 구현했습니다. 이는 오래된 것을 금지합니다.0<octal>숫자들그러나 이상하게도 다음과 같은 참고 사항도 추가됩니다.

/* in any case, allow '0' as a literal */

특별한nonzeroa만 던지는 깃발SyntaxError다음 숫자 시퀀스에 0이 아닌 숫자가 포함된 경우.

PEP 3127은 이 경우를 허용하지 않기 때문에 이는 이상합니다.

이 PEP는 선행 0을 사용하여 8진수를 지정하는 기능을 Python 3.0(및 Python 3.0 미리보기 모드 2.6)의 언어에서 제거하고 선행 "0"이 바로 뒤에 다른 숫자가 올 때마다 구문 오류가 발생할 것을 제안합니다.

(내 것이 아님)

따라서, 여러 개의 0이 허용된다는 사실은 기술적으로 PEP를 위반하는 것이며, 기본적으로 Georg Brandl에 의해 특별한 사례로 구현되었습니다.그는 다음을 주목하기 위해 해당 문서를 변경했습니다."0"+에 대한 타당한 사례였습니다.decimalinteger(이전에는 아래에서 다루었습니다.)octinteger).

우린 아마 조지가 왜 이 사건을 해결하기로 했는지 정확히 알 수 없을 거예요"0"+유효 - 파이썬에서 홀수 코너 케이스로 영원히 남을 수 있습니다.


업데이트 [2015년 7월 28일]:이 질문은 게오르크가 동조한 파이썬 아이디어에 대한 활발한 토론 스레드로 이어졌습니다.

스티븐 다프라노는 다음과 같이 썼습니다.

왜 그렇게 정의되었을까요? [...] 0을 얻기 위해 0000을 쓰는 이유는 무엇일까요?

말씀드릴 수는 있지만, 그럼 당신을 죽여야겠군요.

게오르크

나중에 스레드는 이 특별한 경우를 제거하기 위해 이 버그 보고서를 생성했습니다.여기서 게오르그가 말합니다.

(문서 변경에서 볼 수 있듯이) 의도적으로 변경한 이유를 기억하지 못합니다.

저는 지금 이 변화에 대한 좋은 이유를 생각해 낼 수 없습니다 [...]

그래서 우리는 그것을 가지고 있습니다: 이 모순 뒤에 있는 정확한 이유는 시간이 지남에 따라 사라집니다.

마지막으로 버그 보고서가 거부되었습니다. Python 3.x의 나머지 부분에 대해서는 0 정수에서만 선행 0이 계속 허용됩니다.

경우입니다."0"+)

2.4.4 정수 리터럴

정수 리터럴은 다음과 같은 어휘 정의로 설명됩니다.

정수 ::= 10진수 정수 | 8진수 | 16진수 | 2진수십진수 ::= 0이 아닌 자릿수* | "0"+nonzerodigit ::= "1"...9"숫자 :::= "0"...9"8진수 ::= "0"("o" | "O") 8진수+16진수 ::= "0"("x" | "X") 16진수+bininteger ::= "0" ("b" | "B") bindigit+8진수 ::= "0"...7"16진수 ::= 숫자 | "a"..."f" | "A"..."...F"bindigit ::= "0" | "1"

▁that▁라는 것을 쉽게 알 수 .0특수 케이스가 필요합니다. 그런지 +하지만 거기서는 필요한 것으로 간주됩니다.개발자 메일링 목록을 살펴볼 시간입니다...


두 개 의 Python2가 것에 은 흥미롭습니다.0는 해었니다습으로 해석되었습니다.octinteger는 still입니다.0

십진수 ::= 0이 아닌 숫자* | "0"8진수 ::= "0"("o" | "O") 8진수+ | "0" 8진수+

Python2는 선행 0을 사용하여 8진수를 지정했습니다.

>>> 010
8

는 이러한 동작을 하기 위해 접두사 이잘(에된못한) 동면려방 Python3적두필요합다니접가사러명시작지을하▁explicit▁▁to,▁python다필3요에니를 요구합니다.0b,0o,0x:

>>> 0o10
8

언급URL : https://stackoverflow.com/questions/31447694/why-does-python-3-allow-00-as-a-literal-for-0-but-not-allow-01-as-a-literal

반응형