The Annotated Python Language Reference

이 참조 설명서는 언어의 문법과 "중심 개념들(core semantics)"을 설명한다. 딱딱하더라도 정확하고 완전해지려고 한다. 중심에서 벗어난 내장형, 내장 함수, 모듈들의 개념들은 파이썬 표준 라이브러리 에 기술되어 있다. 언어에 대한 비형식적인 소개는 파이썬 자습서 에서 제공된다. C와 C++ 프로그래머를 위해서는 두 개의 설명서가 따로 제공된다: 파이썬 인터프리터 확장 및 내장 는 파이썬 확장 모듈을 작성하는 방법에 대한 큰 그림을 설명하고, 파이썬/C API 레퍼런스 설명서 은 C/C++ 프로그래머에게 제공되는 인터페이스들을 상세하게 기술한다.

APLR

실제로 언어 레퍼런스는 딱딱할 뿐만 아니라 함축적이기 때문에 읽기가 매우 어렵습니다. 이 시리즈는 언어 레퍼런스에 상세한 주석을 붙여, 모호한 부분들에 대한 해석과, 관련 정보들을 제공해서 좀 더 이해하기 쉬운 버전으로 만듭니다. 이 과정에서 언어 레퍼런스의 정확성을 손상시키고 싶지는 않습니다. 때문에 언어 레퍼런스의 구조를 그대로 따르면서, 이런 식으로 주석을 제공합니다.

1. 개요

이 레퍼런스 설명서는 파이썬 프로그래밍 언어를 설명한다. 자습서를 목표로 하고 있지 않다.

가능한 한 정확하려고 노력하고 있지만, 문법과 구문 해석 이외의 모든 것에는 형식 규격보다는 자연어를 사용한다. 이 선택이 평균적인 독자들이 문서를 좀 더 잘 이해하도록 만들지만, 동시에 모호해질 가능성 역시 만든다. 결과적으로, 만약 여러분이 화성에서 왔고 이 문서만으로 파이썬을 다시 구현 하려고 하면, 아마도 여러 가지를 짐작해야 할 것이고 결국 많이 다른 언어를 만드는 것으로 끝날 것이다. 반면에, 여러분이 파이썬을 사용하고 있고 언어의 특정 영역에 대한 정확한 규칙에 대해 궁금해하고 있다면 거의 확실히 이곳에서 답을 찾을 수 있다. 좀 더 형식화된 정의를 보고 싶다면, 아마도 여러분의 시간을 기부하는 편이 좋다 --- 그렇지 않으면 클로닝 기계를 발명하거나 :-).

참조 문서에 너무 많은 구현 세부 사항을 넣는 것은 위험하다. 구현은 변경될 것이고 같은 언어의 다른 구현도 좀 다른 방식으로 동작할 수 있다. 반면에 (대안 구현이 점차 지지도를 높여가고 있기는 하지만) CPython 은 가장 널리 사용되는 파이썬 구현이고, 그것의 특별한 경우 들은 때로 언급할 가치가 있다. 구현이 추가의 제약을 내포하고 있는 경우는 특히 그렇다. 그래서, 텍스트 중간중간 짧은 "구현 노트" 가 튀어나오는 것을 보게 될 것이다.

모든 파이썬 구현에는 많은 내장 표준 모듈들이 따라온다. 이것들은 파이썬 표준 라이브러리 에 기술되어 있다. 언어 정의에 주목할 만한 방식으로 관계될 경우 몇몇 내장 모듈들은 따로 언급된다.

1.1. 대안 구현들

눈에 띄게 널리 사용되는 파이썬 구현이 존재하기는 하지만, 특정한 관심사를 가진 대상들에게 호소력을 가진 여러 대안 구현들이 존재한다.

APLR

"눈에 띄게 널리 사용되는 파이썬 구현" 은 당연히 CPython 을 뜻합니다.

알려진 구현들은:

CPython
원조이기도 하고 가장 잘 관리되고 있는 C로 작성된 파이썬 구현이다. 언어의 새로운 기능은 보통 여기에서 처음 등장한다.
Jython
파이썬 자바구현. 이 구현은 자바 응용 프로그램을 위한 스크립트 언어로 사용되거나, 자바 클래스 라이브러리를 활용하는 응용 프로그램을 만드는데 사용될 수 있다. 종종 자바 라이브러리의 테스트를 만드는 데 사용되기도 한다. 더 자세한 정보는 Jython 웹사이트 에서 찾을 수 있다.
Python for .NET
이 구현은 실제로는 CPython 구현을 사용하지만, 매니지드(managed) .NET 응용 프로그램이고 .NET 라이브러리를 제공한다. Bryan Lloyd가 만들었다. 더 자세한 정보는 Python for .NET 홈페이지 에서 제공된다.
IronPython

.NET을 위한 대안 파이썬. Python.NET 과는 달리 이것은 IL을 생성하고, 파이썬 코드를 .NET 어셈블리로 직접 컴파일하는 완전한 파이썬 구현이다. Jim Hugunin 이 만들었는데, Jython 의 원저자이기도 하다. 자세한 정보는 IronPython 웹사이트 에서 얻을 수 있다.

APLR

Jim Hugunin 은 수치 연산에 널리 사용되는 NumPy 의 전신인 Numerical Python 의 저자이기도 합니다.

PyPy

완전히 파이썬으로 작성된 파이썬 구현. 스택 리스(stackless) 지원이나 JIT 컴파일러와 같이 다른 구현에서는 찾을 수 없는 고급 기능을 제공한다. 이 프로젝트의 목표 중 하나는 (파이썬으로 쓰였기 때문에) 인터프리터 수정을 쉽게 만들어서 언어 자체에 대한 실험을 북돋는 것이다. 자세한 정보는 PyPy 프로젝트의 홈페이지 에서 찾을 수 있다.

APLR

대안 구현들 중에서 가장 주목받는 구현입니다. 여러 이유가 있겠지만, 특히 JIT 컴파일러로 인해 순수한 파이썬 코드의 경우는 CPython 보다도 높은 속도를 보여주고 있습니다. 파이썬 3 지원이 뒤처져있는 것이 문제였지만, 최근의 파이썬 3.5 지원으로 인해 사용자 층을 더 늘릴 수 있을 것으로 보입니다.

각 구현은 이 설명서에서 설명되는 언어와 조금씩 각기 다른 방법으로 벗어나거나, 표준 파이썬 문서에서 다루는 범위 밖의 특별한 정보들을 소개한다. 여러분이 사용 중인 구현에 대해 어떤 것을 더 알아야 하는지 판단하기 위해서는 구현 별로 제공되는 문서를 참조할 필요가 있다.

1.2. 표기법

구문 분석과 문법의 기술은 수정된 BNF 문법 표기법을 사용한다. 이것은 다음과 같은 정의 스타일을 사용한다.

APLR

BNF 는 Backus–Naur Form 을 뜻하는데, 형식 문법을 정의하는데 사용되는 표기법입니다. 기본 개념은 기호들의 생성 규칙들을 나열하는 것인데, 여러 변종이 있어서 조금씩 표기법의 차이를 보입니다. 이 문서에서 사용하는 수정된 BNF 의 표기법은 아래에서 설명됩니다.

문법의 형식 정의는 보통 두 가지 단계로 나누어 기술됩니다. 첫번째는 구문 분석이라는 단계로, 개별 문자들을 조합하여 조금 높은 수준의 토큰들을 만들어내는 것입니다. 토큰들은 정수, 키워드와 같은 것들입니다. 두번째는 문법 구성 단계로, 이 토큰들이 문법적인 구조를 이루도록 연결하는 것입니다. 이 문서도 두 단계를 따로 기술하고 있는데, 두 경우 모두 BNF 표기법을 사용해서 기술하고 있습니다.

name      ::=  lc_letter (lc_letter | "_")*
lc_letter ::=  "a"..."z"

첫 줄은 namelc_letter 로 시작하고, 없거나 하나 이상의 lc_letter 나 밑줄이 뒤따르는 형태로 구성된다고 말한다. 한편 lc_letter'a''z' 사이의 문자 하나다. (사실 이 규칙은 이 문서에서 구문과 문법 규칙에서 정의되는 이름들에 대한 규칙이다.)

APLR

마지막 "이 규칙은 이 문서에서 구문과 문법 규칙에서 정의되는 이름들에 대한 규칙이다." 라는 문장은, 이 규칙이 이 문서에서 BNF 문법 표기법에 사용한 이름들에 적용되는 규칙이라는 뜻입니다. 즉 namelc_letter 가 name 규칙을 따르고 있어서, 영어 소문자와 밑줄 만으로 구성되어 있고, 영어 소문자로 시작합니다.

개별 규칙은 이름 (위 규칙에 등장하는 name)과 ::= 로 시작한다. 세로막대(|)는 대안들을 분리하는 데 사용된다; 이 표기법에서 우선순위가 가장 낮은 연산자다. 별표(*)는 앞에 나오는 항목이 생략되거나 한 번 이상 반복될 수 있다는 의미다; 비슷하게, 더하기(+)는 한 번 이상 반복될 수 있지만 생략할 수는 없다는 뜻이고, 꺾쇠괄호([])로 둘러싸인 것은 최대 한 번 나올 수 있고, 생략 가능하다는 뜻이다. *+ 연산자는 최대한 엄격하게 연결된다; 우선순위가 가장 높다; 괄호는 덩어리로 묶는 데 사용된다. 문자열 리터럴은 따옴표로 둘러싸인다. 공백은 토큰을 분리하는 용도로만 사용된다. 규칙은 보통 한 줄로 표현된다; 대안이 많은 규칙은 여러 줄로 표현될 수도 있는데, 뒤따르는 줄들이 세로막대로 시작되게 만든다.

APLR

"*+ 연산자는 최대한 엄격하게 연결된다" 는, 연산자 우선 순위가 가장 높기 때문에 가장 직전의 항목에만 적용될 뿐 그 이전의 항목까지 확장되지는 않는다는 뜻입니다. 그 이전 까지 확장하려면 괄호를 사용해야 합니다.

APLR

리러털(literal) 은 값 자체를 표현하는 문법 요소입니다. 가령 'hello', 123 처럼 원시 파일에 값이 그대로 입력되어 있는 형태를 뜻합니다.

구문 정의 (위에서 든 예와 같이) 에서는, 두 가지 추가 관례가 사용된다: 두 개의 리터럴 문자가 세 개의 점으로 분리되어 있으면 주어진 (끝의 두 문자 모두 포함하는) 범위의 ASCII 문자 중 어느 하나라는 뜻이다. 홑화살괄호(<...>) 안에 들어있는 구문은, 정의되는 기호에 대한 비형식적 설명을 제공한다. 즉 필요한 경우 '제어 문자'를 설명하는데 사용될 수 있다.

APLR

홑화살괄호(<...>) 표기는 식별자와 키워드 에서 볼 수 있습니다. 완전한 BNF 를 사용해서 표기할 경우 너무 복잡해지는 반면, 비형식적인 설명으로도 그 의미를 명확히 할 수 있을 때 사용됩니다.

사용되는 표기법이 거의 같다고 하더라도, 구문과 문법 정의 간에는 커다란 차이가 있다: 구문 정의는 입력의 개별 문자에 적용되는 반면, 문법 정의는 구문 분석기가 만들어내는 토큰들에 적용된다. 다음 장 ("구문 분석(Lexical Analysis)")에서 사용되는 모든 BNF는 구문 정의다; 그 이후의 장에서는 문법 정의다.