PEP 3112 – Python 3000의 바이트 리터럴
- Author:
- Jason Orendorff <jason.orendorff at gmail.com>
- Status:
- Final
- Type:
- Standards Track
- Requires:
- 358
- Created:
- 23-Feb-2007
- Python-Version:
- 3.0
- Post-History:
- 23-Feb-2007
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 PEP 358에서 도입된 bytes 객체를 위한 리터럴 문법을 제안합니다. 목적은 ASCII 문자열과 임의의 바이너리 데이터를 편리하게 표기하는 방법을 제공하는 것입니다.
동기
Python 3000에서 ASCII 문자열을 표기하는 기존 방법은 다음과 같습니다.:
bytes('Hello world', 'ascii')
'Hello world'.encode('ascii')
제안하는 문법은 다음과 같습니다:
b'Hello world'
Python 3000에서 8비트 바이너리 시퀀스를 표기하는 기존 방법은 다음과 같습니다.:
bytes([0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00])
bytes('\x7fELF\x01\x01\x01\0', 'latin-1')
'7f454c4601010100'.decode('hex')
제안하는 문법은 다음과 같습니다:
b'\x7f\x45\x4c\x46\x01\x01\x01\x00'
b'\x7fELF\x01\x01\x01\0'
두 경우 모두 새 문법의 장점은 간결함, 약간의 효율성 향상, 그리고 인코딩 오류를 런타임이 아닌 컴파일 시점에 감지할 수 있다는 점입니다. 간결함의 이점은 바이트 객체의 문자열과 유사한 메서드를 사용할 때 특히 크게 느껴집니다.:
lines = bdata.split(bytes('\n', 'ascii')) # existing syntax
lines = bdata.split(b'\n') # proposed syntax
또한 코드를 Python 2.x에서 Python 3000으로 변환할 때도 그렇습니다.:
sok.send('EXIT\r\n') # Python 2.x
sok.send('EXIT\r\n'.encode('ascii')) # Python 3000 existing
sok.send(b'EXIT\r\n') # proposed
문법 변경
제안하는 문법은 기존 문자열 문법 [1]의 확장입니다.
새 bytes 리터럴을 포함한 문자열의 새 문법은 다음과 같습니다:
stringliteral: [stringprefix] (shortstring | longstring)
stringprefix: "b" | "r" | "br" | "B" | "R" | "BR" | "Br" | "bR"
shortstring: "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring: "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem: shortstringchar | escapeseq
longstringitem: longstringchar | escapeseq
shortstringchar:
<any source character except "\" or newline or the quote>
longstringchar: <any source character except "\">
escapeseq: "\" NL
| "\\" | "\'" | '\"'
| "\a" | "\b" | "\f" | "\n" | "\r" | "\t" | "\v"
| "\ooo" | "\xhh"
| "\uxxxx" | "\Uxxxxxxxx" | "\N{name}"
다음의 추가 제약은 바이트 리터럴(stringprefix에 b 또는 B가 있는 stringliteral 토큰)에만 적용됩니다.
- 각
shortstringchar또는longstringchar는 소스 파일의 인코딩 선언 [2]과 관계없이 1 이상 127 이하의 문자여야 합니다. - 유니코드 전용 이스케이프 시퀀스인
\uxxxx,\Uxxxxxxxx,\N{name}는 Python 2.x에서는 인식되지 않으며 Python 3000에서는 금지됩니다.
인접한 바이트 리터럴에는 인접한 문자열 리터럴과 같은 연결 규칙 [3]이 적용됩니다. 문자열 리터럴에 인접한 바이트 리터럴은 오류입니다.
의미론
바이트 리터럴은 평가될 때마다 새 bytes 객체를 생성합니다. 새 객체에 담긴 바이트는 리터럴의 shortstringitem 또는 longstringitem 부분이 나타내는 바이트이며, 순서도 같습니다.
근거
제안하는 문법은 8비트 문자열을 다루는 대부분의 코드에 대해 Python 2.x에서 Python 3000으로 더 깔끔하게 이전할 수 있는 경로를 제공합니다. 문자열 리터럴의 기존 8비트 의미를 유지하려면 대개 b 접두사를 붙이기만 하면 됩니다. 유일한 예외는 127보다 큰 바이트를 포함한 Python 2.x 문자열이며, 이런 문자열은 이스케이프 시퀀스를 사용해 다시 작성해야 합니다. 소스 파일을 한 인코딩에서 다른 인코딩으로 변환하고 인코딩 선언을 그에 맞게 고치더라도 프로그램의 의미는 유지되어야 합니다. Python 2.x의 비유니코드 문자열은 이 원칙을 위반하지만, Python 3000의 바이트 리터럴은 이를 위반해서는 안 됩니다.
접두사에 b가 있는 문자열 리터럴은 Python 2.5에서 항상 문법 오류이므로, 이 문법은 bytes 타입과 함께 Python 2.6에 도입될 수 있습니다.
바이트 리터럴은 리스트 디스플레이와 마찬가지로, 그리고 문자열 리터럴과는 달리, 평가될 때마다 새 객체를 생성합니다. 이는 바이트 리터럴이 리스트와 마찬가지로, 그리고 문자열과는 달리, 변경 가능하기 때문에 필요합니다 [4].
참조 구현
Thomas Wouters가 Py3K 브랜치에 구현을 체크인했습니다(r53872).
참고 문헌
Copyright
This document has been placed in the public domain.