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

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이 PEP는 함수 인자가 이름이 지정된 매개변수 슬롯에 할당되는 방식을 변경할 것을 제안합니다. 특히 “키워드 전용” 인자를 선언할 수 있도록 합니다. 이러한 인자는 키워드로만 제공할 수 있으며 위치 인자로 자동으로 채워지지 않습니다.

근거

현재 Python 함수 호출 방식에서는 위치 또는 키워드로 인자를 지정할 수 있습니다. 인자는 이름으로 명시적으로 채우거나 위치로 암시적으로 채울 수 있습니다.

함수가 가변 개수의 인자를 받는 것이 바람직한 경우가 자주 있습니다. Python 언어는 ‘varargs’ 구문(*name)을 사용하여 이를 지원하며, 이 구문은 ‘남은’ 인자를 튜플로 묶어 가변 인자 매개변수에 전달하도록 지정합니다.

현재는 가변 인자 슬롯을 채우기 전에 일반 인자 슬롯을 모두 채워야 한다는 제한이 있습니다.

이는 항상 바람직한 것은 아닙니다. 함수가 가변 개수의 인자를 받으면서 키워드 인자 형식으로 하나 이상의 ‘옵션’도 받는 경우를 쉽게 생각해 볼 수 있습니다. 현재 이를 수행하는 유일한 방법은 가변 인자와 ‘keywords’ 인자(**kwargs)를 모두 정의한 다음, 딕셔너리에서 원하는 키워드를 수동으로 추출하는 것입니다.

사양

구문 측면에서 제안된 변경 사항은 상당히 간단합니다. 첫 번째 변경 사항은 가변 인자 뒤에 일반 인자가 나타날 수 있도록 허용하는 것입니다.:

def sortwords(*wordlist, case_sensitive=False):
    ...

이 함수는 임의의 개수의 위치 인자를 받으며, ‘case_sensitive’라는 키워드 옵션도 받습니다. 이 옵션은 위치 인자로 채워지지 않으며, 이름을 지정하여 명시적으로 제공해야 합니다.

키워드 전용 인자는 기본값을 가질 필요가 없습니다. Python에서는 모든 인자를 값에 바인딩해야 하며, 키워드 전용 인자에 값을 바인딩하는 유일한 방법은 키워드를 사용하는 것이므로 이러한 인자는 ‘필수 키워드’ 인자가 됩니다. 이러한 인자는 호출자가 제공해야 하며, 키워드를 통해 제공해야 합니다.

두 번째 구문 변경 사항은 가변 인자의 인자 이름을 생략할 수 있도록 허용하는 것입니다. 이는 다른 방식으로는 가변 인자를 받지 않는 함수에서도 키워드 전용 인자를 사용할 수 있도록 하기 위한 것입니다.:

def compare(a, b, *, key=None):
    ...

이 변경의 근거는 다음과 같습니다. 잠시 여러 위치 인자와 키워드 인자를 받는 함수를 상상해 보십시오.:

def compare(a, b, key=None):
    ...

이제 ‘key’를 키워드 전용 인자로 만들고 싶다고 가정해 보십시오. 위 구문에서는 키워드 인자 바로 앞에 가변 인자를 추가하여 이를 구현할 수 있습니다.:

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은 위치 매개변수의 끝을 나타내는 이 ‘단일 별표’ 구문을 지지한다고 선언했습니다.)

함수 호출 동작

이전 섹션에서는 기존 동작과 새로운 동작의 차이를 설명합니다. 그러나 이전 모델을 참조하지 않고도 그 자체로 성립하는 새로운 동작에 대한 설명을 갖는 것도 유용합니다. 따라서 다음 섹션에서는 그러한 설명을 제공하고자 합니다.

함수를 호출하면 입력 인자는 다음과 같이 형식 매개변수에 할당됩니다:

  • 각 형식 매개변수에는 해당 매개변수에 할당된 인자의 값을 담는 데 사용될 슬롯이 있습니다.
  • 값이 할당된 슬롯은 ‘채워짐’으로 표시됩니다. 아직 값이 할당되지 않은 슬롯은 ‘비어 있음’으로 간주됩니다.
  • 처음에는 모든 슬롯이 비어 있음으로 표시됩니다.
  • 위치 인자가 먼저 할당되고, 그다음 키워드 인자가 할당됩니다.
  • 각 위치 인자에 대해 다음을 수행합니다:
    • 인자를 채워지지 않은 첫 번째 매개변수 슬롯에 바인딩하려고 시도합니다. 해당 슬롯이 가변 인자 슬롯이 아니면 슬롯을 ‘채워짐’으로 표시합니다.
    • 다음 채워지지 않은 슬롯이 가변 인자 슬롯이고 이름이 없으면 오류입니다.
    • 그렇지 않고 다음 채워지지 않은 슬롯이 가변 인자 슬롯이면 남아 있는 모든 비키워드 인자를 가변 인자 슬롯에 배치합니다.
  • 각 키워드 인자에 대해 다음을 수행합니다:
    • 키워드와 이름이 같은 매개변수가 있으면 인자 값을 해당 매개변수 슬롯에 할당합니다. 그러나 매개변수 슬롯이 이미 채워져 있으면 오류입니다.
    • 그렇지 않고 ‘키워드 딕셔너리’ 인자가 있으면 키워드 이름을 딕셔너리 키로 사용하여 인자를 딕셔너리에 추가합니다. 단, 해당 키를 가진 항목이 이미 있으면 오류입니다.
    • 그렇지 않고 키워드 딕셔너리도 없으며 일치하는 이름의 매개변수도 없으면 오류입니다.
  • 마지막으로:
    • 가변 인자 슬롯이 아직 채워지지 않았으면 빈 튜플을 값으로 할당합니다.
    • 남아 있는 각 빈 슬롯에 대해 해당 슬롯의 기본값이 있으면 그 기본값으로 슬롯을 채웁니다. 기본값이 없으면 오류입니다.

현재 Python 구현에 따라 발생한 모든 오류는 TypeError를 발생시켜 알립니다. (다른 동작을 원한다면 이는 다른 PEP에서 다룰 주제입니다.)

하위 호환성

이 PEP에서 지정하는 함수 호출 동작은 기존 동작의 상위 집합입니다. 즉, 기존 프로그램은 모두 계속 작동할 것으로 예상됩니다.