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

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 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'

두 경우 모두 새 문법의 장점은 간결성, 약간의 효율성 향상, 그리고 런타임이 아니라 컴파일 시점에 인코딩 오류를 감지할 수 있다는 점입니다. 간결성의 이점은 bytes 객체의 문자열 유사 메서드를 사용할 때 특히 두드러집니다.:

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].

새 바이트 리터럴을 포함한 문자열의 새 문법은 다음과 같습니다.:

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}"

다음 추가 제한은 stringliteral 토큰의 stringprefixb 또는 B가 있는 바이트 리터럴에만 적용됩니다.

  • 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).

참조 문헌