1. 개요¶
이 레퍼런스 설명서는 파이썬 프로그래밍 언어를 설명합니다. 자습서를 목표로 하고 있지 않습니다.
가능한 한 정확하려고 노력하고 있지만, 문법과 어휘 분석 이외의 모든 것에는 형식 규격보다는 자연어를 사용합니다. 이 선택이 평균적인 독자들이 문서를 좀 더 잘 이해하도록 만들지만, 동시에 모호해질 가능성 역시 만듭니다. 결과적으로, 만약 여러분이 화성에서 왔고 이 문서만으로 파이썬을 다시 구현하려고 하면, 아마도 여러 가지를 짐작해야 할 것이고 결국 많이 다른 언어를 만드는 것으로 끝날 것입니다. 반면에, 여러분이 파이썬을 사용하고 있고 언어의 특정 영역에 대한 정확한 규칙에 대해 궁금해하고 있다면 거의 확실히 이곳에서 답을 찾을 수 있습니다. 좀 더 형식화된 정의를 보고 싶다면, 아마도 여러분의 시간을 기부하는 편이 좋습니다 — 그렇지 않으면 클로닝 기계를 발명하거나 :-).
참조 문서에 너무 많은 구현 세부 사항을 넣는 것은 위험합니다. 구현은 변경될 것이고 같은 언어의 다른 구현도 좀 다른 방식으로 동작할 수 있습니다. 반면에 (대안 구현이 점차 지지도를 높여가고 있기는 하지만) CPython 은 가장 널리 사용되는 파이썬 구현이고, 그것의 특별한 경우 들은 때로 언급할 가치가 있습니다. 구현이 추가의 제약을 내포하고 있는 경우는 특히 그렇습니다. 그래서, 텍스트 중간중간 짧은 “구현 노트” 가 튀어나오는 것을 보게 될 것입니다.
모든 파이썬 구현에는 많은 내장 표준 모듈들이 따라옵니다. 이것들은 파이썬 표준 라이브러리 에 기술되어 있습니다. 언어 정의에 주목할 만한 방식으로 관계될 경우 몇몇 내장 모듈들은 따로 언급됩니다.
1.1. 대안 구현들¶
눈에 띄게 널리 사용되는 파이썬 구현이 존재하기는 하지만, 특정한 관심사를 가진 대상들에게 호소력을 가진 여러 대안 구현들이 존재합니다.
알려진 구현들은:
- 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 웹사이트 에서 얻을 수 있습니다.
- PyPy
완전히 파이썬으로 작성된 파이썬 구현. 스택 리스(stackless) 지원이나 JIT 컴파일러와 같이 다른 구현에서는 찾을 수 없는 고급 기능을 제공합니다. 이 프로젝트의 목표 중 하나는 (파이썬으로 쓰였기 때문에) 인터프리터 수정을 쉽게 만들어서 언어 자체에 대한 실험을 북돋는 것입니다. 자세한 정보는 PyPy 프로젝트의 홈페이지 에서 찾을 수 있습니다.
각 구현은 이 설명서에서 설명되는 언어와 조금씩 각기 다른 방법으로 벗어나거나, 표준 파이썬 문서에서 다루는 범위 밖의 특별한 정보들을 소개합니다. 여러분이 사용 중인 구현에 대해 어떤 것을 더 알아야 하는지 판단하기 위해서는 구현 별로 제공되는 문서를 참조할 필요가 있습니다.
1.2. 표기법¶
어휘 분석 및 구문에 대한 설명은 EBNF 와 PEG 가 혼합된 문법 표기법을 사용합니다. 예를 들면:
name:letter(letter|digit| "_")* letter: "a"..."z" | "A"..."Z" digit: "0"..."9"
이 예시에서 첫 번째 줄은 name``이 ``letter 뒤에 0개 이상의 letter, digit 및 언더스코어의 시퀀스가 이어지는 구조임을 나타냅니다. 여기서 letter``는 ``'a``부터 ``z``까지, 그리고 ``A``부터 ``Z``까지의 단일 문자 중 하나이며, ``digit``은 ``0``에서 ``9 사이의 단일 문자를 의미합니다.
각 규칙은 이름(정의되는 규칙을 식별함)과 콜론(:)으로 시작합니다. 콜론 오른쪽의 정의는 다음 구문 요소들을 사용합니다.
name: 이름은 다른 규칙을 참조합니다. 가능한 경우 해당 규칙의 정의로 연결되는 링크입니다.TOKEN: 대문자 이름은 token 을 가리킵니다. 문법 정의 목적상 토큰과 규칙은 동일하게 취급됩니다.
"text",'text': 단일 또는 이중 따옴표 안의 텍스트는 문자와 똑같이 일치해야 합니다(따옴표 제외). 따옴표의 유형은text의 의미에 따라 선택됩니다.e1 e2: 공백으로만 구분된 항목들은 시퀀스를 나타냅니다. 여기서e1뒤에는 반드시e2가 따라와야 합니다.e1 | e2: 세로막대는 대안을 구분하는 데 사용됩니다. 이는 PEG의 “순서 있는 선택(ordered choice)”을 나타내며,e1이 일치하면e2는 고려되지 않습니다. 전통적인 PEG 문법에서는 이를 세로막대 대신 슬래시(/)로 표기합니다. 더 자세한 배경 및 세부 사항은 PEP 617 을 참조하십시오.e*: 별표는 앞선 항목이 0회 이상 반복됨을 의미합니다.e+: 마찬가지로 더하기는 한 번 이상 반복됨을 의미합니다.[e]: 대괄호로 둘러싸인 구문은 0회 또는 1회 발생을 의미합니다. 즉, 해당 구문이 선택 사항임을 나타냅니다.e?: 물음표는 대괄호와 정확히 동일한 의미를 가지며, 앞선 항목이 선택 사항임을 나타냅니다.(e): 괄호는 그룹화에 사용됩니다.
다음 표기법은 오직 어휘 정의 에서만 사용됩니다.
"a"..."z": 세 개의 점으로 구분된 두 리터럴 문자는 주어진(양 끝 포함) 범위 내의 임의의 단일 ASCII 문자를 선택할 수 있음을 의미합니다.<...>: 홑화살괄호로 둘러싸인 구문은 일치하는 기호에 대한 비형식적 설명(예:<any ASCII character except "\">)이나 인근 텍스트에서 정의된 약어(예:<Lu>)를 나타냅니다.
일부 정의에서는 *lookahead*를 사용하기도 하며, 이는 특정 위치에서 요소가 일치해야 하거나(또는 일치하지 않아야 함)하지만 입력값은 소비하지 않음을 나타냅니다.
&e: 긍정적 미리 보기(즉,e가 일치해야 함)!e: 부정형 미리 보기(negative lookahead, 즉,e가 일치하지 않아야 함)
단항 연산자(*, +, ?)는 가능한 한 강력하게 결합하며, 세로 막대(|)는 가장 약하게 결합합니다.
공백은 토큰을 구분하는 용도로만 의미가 있습니다.
규칙은 일반적으로 한 줄에 포함되지만, 너무 긴 규칙은 줄 바꿈이 가능합니다:
literal: stringliteral | bytesliteral
| integer | floatnumber | imagnumber
또는 첫 번째 줄을 콜론으로 끝내고 각 대안을 새 줄에서 세로 막대로 시작하도록 규칙을 구성할 수 있습니다. 예를 들어:
literal: | stringliteral | bytesliteral | integer | floatnumber | imagnumber
이것이 첫 번째 대안이 비어 있다는 것을 의미하는 것은 아닙니다.
1.2.1. 어휘 및 구문 정의¶
There is some difference between lexical and syntactic analysis: the lexical analyzer operates on the individual characters of the input source, while the parser (syntactic analyzer) operates on the stream of tokens generated by the lexical analysis. However, in some cases the exact boundary between the two phases is a CPython implementation detail.
The practical difference between the two is that in lexical definitions,
all whitespace is significant.
The lexical analyzer discards all whitespace that is not
converted to tokens like token.INDENT or NEWLINE.
Syntactic definitions then use these tokens, rather than source characters.
이 문서는 두 가지 스타일의 정의 모두에 동일한 BNF 문법을 사용합니다. 다음 장(어휘 분석)에서 사용되는 모든 BNF는 어휘 정의이며, 이후 장에서 사용되는 것들은 구문 정의입니다.