PEP 3102 – 키워드 전용 인자
- Author:
- Talin <viridia at gmail.com>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 22-Apr-2006
- Python-Version:
- 3.0
- Post-History:
- 28-Apr-2006, 19-May-2006
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 함수 인자를 이름이 있는 매개변수 슬롯에 할당하는 방식을 변경할 것을 제안합니다. 특히 이 변경으로 “키워드 전용” 인자를 선언할 수 있게 됩니다. 키워드 전용 인자는 키워드로만 전달할 수 있으며, 위치 인자로 자동으로 채워지는 일이 절대 없는 인자입니다.
근거
현재 Python 함수 호출 패러다임에서는 인자를 위치로 지정할 수도 있고 키워드로 지정할 수도 있습니다. 인자는 이름을 통해 명시적으로 채워지거나 위치를 통해 암묵적으로 채워집니다.
함수가 가변 개수의 인자를 받는 것이 바람직한 경우가 자주 있습니다. Python 언어는 ‘varargs’ 문법(*name)으로 이를 지원하며, 이 문법은 ‘남는’ 인자를 모두 튜플로 묶어 varargs 매개변수에 전달하도록 지정합니다.
여기에는 한 가지 제약이 있는데, 현재는 일반 인자 슬롯이 모두 채워져야만 vararg 슬롯이 채워질 수 있다는 점입니다.
이것이 항상 바람직한 것은 아닙니다. 가변 개수의 인자를 받으면서 키워드 인자 형태의 ‘옵션’도 하나 이상 받는 함수를 쉽게 떠올릴 수 있습니다. 현재 이렇게 하는 유일한 방법은 varargs 인자와 ‘keywords’ 인자(**kwargs)를 모두 정의한 다음, 원하는 키워드를 딕셔너리에서 직접 꺼내는 것입니다.
명세
문법적으로 보면 제안하는 변경은 꽤 간단합니다. 첫 번째 변경은 varargs 인자 뒤에 일반 인자가 올 수 있도록 허용하는 것입니다:
def sortwords(*wordlist, case_sensitive=False):
...
이 함수는 위치 인자를 개수에 상관없이 받으며, ‘case_sensitive’라는 키워드 옵션도 받습니다. 이 옵션은 위치 인자로는 절대 채워지지 않으며, 반드시 이름을 통해 명시적으로 지정해야 합니다.
키워드 전용 인자에 반드시 기본값이 있어야 하는 것은 아닙니다. Python은 모든 인자가 값에 바인딩되어야 하고 키워드 전용 인자에 값을 바인딩하는 유일한 방법은 키워드를 통하는 것이므로, 이러한 인자는 ‘필수 키워드’ 인자가 됩니다. 이러한 인자는 호출자가 반드시 전달해야 하며, 반드시 키워드를 통해 전달해야 합니다.
두 번째 문법 변경은 varargs 인자의 이름을 생략할 수 있도록 허용하는 것입니다. 이는 원래라면 varargs 인자를 받지 않을 함수에서도 키워드 전용 인자를 사용할 수 있도록 하기 위한 것입니다:
def compare(a, b, *, key=None):
...
이 변경의 근거는 다음과 같습니다. 여러 개의 위치 인자와 함께 키워드 인자 하나를 받는 함수를 잠시 상상해 보십시오:
def compare(a, b, key=None):
...
이제 ‘key’를 키워드 전용 인자로 만들고 싶다고 가정해 봅시다. 위의 문법을 따르면 키워드 인자 바로 앞에 varargs 인자를 추가하여 이를 달성할 수 있습니다:
def compare(a, b, *ignore, key=None):
...
안타깝게도 ‘ignore’ 인자는 호출자가 잘못 전달했을 수 있는 위치 인자까지 모두 흡수해 버립니다. 원치 않는 인자가 전달되면 오류가 발생하는 편이 낫기 때문에 다음과 같이 할 수 있습니다:
def compare(a, b, *ignore, key=None):
if ignore: # If ignore is not empty
raise TypeError
편리한 축약형으로서 ‘ignore’라는 이름을 그냥 생략할 수 있으며, 이는 ‘이 지점 이후로는 위치 인자를 허용하지 않음’을 뜻합니다.
(참고: 대안 문법 제안들에 대해 많은 논의를 거친 끝에, BDFL은 위치 매개변수의 끝을 나타내는 데 이 ‘단일 별표’ 문법을 사용하기로 결정했습니다.)
함수 호출 동작
이전 절에서는 기존 동작과 새 동작의 차이를 설명합니다. 그러나 이전 모델을 참조하지 않고도 그 자체로 이해할 수 있는 새 동작 설명이 있으면 유용합니다. 따라서 이어지는 절에서는 그러한 설명을 제공하고자 합니다.
함수가 호출되면 입력 인자는 다음과 같이 형식 매개변수에 할당됩니다:
- 각 형식 매개변수마다 해당 매개변수에 할당된 인자의 값을 담는 데 사용될 슬롯이 하나씩 있습니다.
- 값이 할당된 슬롯은 ‘채워짐’으로 표시됩니다. 아직 값이 할당되지 않은 슬롯은 ‘비어 있음’으로 간주됩니다.
- 처음에는 모든 슬롯이 비어 있음으로 표시됩니다.
- 위치 인자가 먼저 할당되고, 그다음에 키워드 인자가 할당됩니다.
- 각 위치 인자에 대해 다음을 수행합니다:
- 인자를 채워지지 않은 첫 번째 매개변수 슬롯에 바인딩하려고 시도합니다. 그 슬롯이 가변 인자(vararg) 슬롯이 아니면 슬롯을 ‘채워짐’으로 표시합니다.
- 채워지지 않은 다음 슬롯이 가변 인자 슬롯이고 이름이 없으면 오류입니다.
- 그렇지 않고 채워지지 않은 다음 슬롯이 가변 인자 슬롯이면, 남은 모든 비키워드 인자를 가변 인자 슬롯에 넣습니다.
- 각 키워드 인자에 대해 다음을 수행합니다:
- 키워드와 이름이 같은 매개변수가 있으면 인자 값을 해당 매개변수 슬롯에 할당합니다. 그러나 해당 매개변수 슬롯이 이미 채워져 있으면 오류입니다.
- 그렇지 않고 ‘키워드 딕셔너리’ 인자가 있으면, 키워드 이름을 딕셔너리 키로 사용하여 인자를 딕셔너리에 추가합니다. 단, 해당 키를 가진 항목이 이미 있으면 오류입니다.
- 그렇지 않고 키워드 딕셔너리도 없고 일치하는 이름의 매개변수도 없으면 오류입니다.
- 마지막으로:
- 가변 인자 슬롯이 아직 채워지지 않았으면 빈 튜플을 그 값으로 할당합니다.
- 남아 있는 각 빈 슬롯에 대해: 해당 슬롯에 기본값이 있으면 그 기본값으로 슬롯을 채웁니다. 기본값이 없으면 오류입니다.
현재 Python 구현에 따라, 발생하는 모든 오류는 TypeError를 발생시키는 방식으로 알립니다. (다른 방식을 원한다면 그것은 별도의 PEP에서 다룰 주제입니다.)
하위 호환성
이 PEP에서 명시하는 함수 호출 동작은 기존 동작의 상위 집합입니다. 즉, 기존의 모든 프로그램은 계속 동작할 것으로 예상됩니다.
Copyright
This document has been placed in the public domain.