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

Python 개선 제안 한국어 번역

PEP 457 – 위치 전용 매개변수 표기법

Author:
Larry Hastings <larry at hastings.org>
Discussions-To:
Python-Dev list
Status:
Final
Type:
Informational
Created:
08-Oct-2013

Table of Contents

번역·라이선스 안내

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

개요

이 PEP는 Python에서 위치 전용 매개변수를 표기하는 방법을 제안합니다. 위치 전용 매개변수는 외부에서 사용할 수 있는 이름이 없는 매개변수입니다. 위치 전용 매개변수를 허용하는 함수를 호출하면 위치 인자는 오직 위치에 따라 이러한 매개변수에 매핑됩니다.

이 PEP는 위치 전용 매개변수를 사용하는 API를 설명할 때 사용할 표기법을 설명하는 정보 제공용 PEP입니다(예: Argument Clinic에서 또는 inspect.Signature 객체의 문자열 표현에서). 별도의 PEP인 PEP 570은 이 표기법을 완전한 Python 구문으로 승격할 것을 제안합니다.

근거

Python은 항상 위치 전용 매개변수를 지원해 왔습니다. Python 초기 버전에는 매개변수를 이름으로 지정한다는 개념이 없었으므로, 자연스럽게 모든 매개변수가 위치 전용이었습니다. Python 1.0 무렵에 이 사항이 변경되면서 모든 매개변수가 갑자기 위치 인자 또는 키워드 인자가 되었습니다. 그러나 현재 Python 버전에서도 많은 CPython “builtin” 함수는 여전히 위치 전용 인자만 허용합니다.

현대 Python으로 구현된 함수는 가변 *args 매개변수를 통해 임의 개수의 위치 전용 인자를 허용할 수 있습니다. 그러나 특정 개수의 위치 전용 매개변수를 허용한다고 지정할 수 있는 Python 구문은 없습니다. 바꾸어 말하면, Python 구문으로는 시그니처를 표현할 수 없는 내장 함수가 많습니다.

이 PEP는 이러한 시그니처를 위한 표기법을 제안하며, 이는 모든 내장 함수를 순수 Python 코드로 구현할 수 있도록 하는 하위 호환 구문의 기반이 될 수 있습니다(해당 제안은 PEP 570을 참조하십시오).

현재 Python에서의 위치 전용 매개변수 의미론

위치 전용 매개변수만 허용하는 내장 함수의 예는 매우 많습니다. 그 결과로 나타나는 의미론은 Python 프로그래머라면 쉽게 경험할 수 있습니다. 인자를 이름으로 지정하여 그러한 함수를 호출해 보기만 하면 됩니다.:

>>> pow(x=5, y=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pow() takes no keyword arguments

또한 특히 흥미로운 의미론을 보이는 함수도 있습니다.

  • range()는 필수 매개변수의 왼쪽에 선택적 매개변수를 허용합니다. [2]
  • dict()는 매핑/이터레이터 매개변수가 선택 사항이며, 의미상 위치 전용이어야 합니다. 이 매개변수에 외부에서 볼 수 있는 이름이 있다면, 해당 이름이 **kwarg 키워드 가변 매개변수 딕셔너리로 들어갈 때 그 이름을 가리게 됩니다! [1]

물론 (*args, **kwargs)를 받아 인자를 직접 구문 분석하면 순수 Python 코드로 이러한 동작을 모두 시뮬레이션할 수 있습니다. 그러나 이렇게 하면 Python 함수의 시그니처와 실제로 허용하는 인자 사이에 단절이 생기며, 해당 인자 구문 분석을 구현하는 작업은 말할 것도 없습니다.

동기

이 PEP는 Python에 위치 전용 매개변수를 구현하자고 제안하지 않습니다. 이 PEP의 목표는 단순히 다음을 위해 구문을 정의하는 것입니다.

  • 문서에서 함수의 인자가 어떻게 해석되는지 정확하게, 명확하고 모호하지 않게, 일관되게 표현할 수 있습니다.
  • 언젠가 커뮤니티가 언어에 위치 전용 매개변수를 추가하기로 결정할 경우를 대비하여 이 구문을 향후 사용을 위해 예약합니다.
  • Argument Clinic은 내장 함수의 인자를 정의할 때 이 구문의 변형을 입력의 일부로 사용할 수 있습니다.

위치 전용 매개변수 문서화의 현재 상태

위치 전용 매개변수에 관한 문서는 불완전하고 일관되지 않습니다:

  • 일부 함수는 선택적 그룹을 중첩된 대괄호로 묶어 표시합니다. [3]
  • 일부 함수는 인자 개수가 서로 다른 여러 프로토타입을 제시하여 선택적 그룹의 위치 전용 인자를 표시합니다. [4]
  • 일부 함수는 위의 두 가지 방식을 모두 사용합니다. [2] [5]

고려해야 할 또 하나의 중요한 사항은 다음과 같습니다. 현재 문서만으로는 함수가 위치 전용 매개변수를 받는지 알 방법이 없습니다. open()은 키워드 인자를 허용하고 ord()는 허용하지 않지만, 문서를 읽는 것만으로는 이것이 사실임을 알 방법이 없습니다.

구문 및 의미론

지금은 *args**kwargs를 무시하고, “1만 피트 상공에서 바라보는” 관점에서 보면 함수 정의의 문법은 현재 다음과 같습니다.:

def name(positional_or_keyword_parameters, *, keyword_only_parameters):

이러한 관점을 바탕으로 하면 함수의 새로운 구문은 다음과 같습니다.:

def name(positional_only_parameters, /, positional_or_keyword_parameters,
         *, keyword_only_parameters):

/ 앞의 모든 매개변수는 위치 전용입니다. 함수 시그니처에 /가 지정되지 않으면 해당 함수는 위치 전용 매개변수를 전혀 받지 않습니다.

위치 전용 매개변수에는 기본값을 지정할 수 있으며, 기본값이 있으면 선택 사항입니다. 기본값이 없는 위치 전용 매개변수는 “필수” 위치 전용 매개변수입니다.

위치 전용 매개변수의 추가 의미론:

  • 위치 전용 매개변수에는 기술적으로 이름이 있지만, 이러한 이름은 내부에서만 사용됩니다. 위치 전용 매개변수는 이름으로 외부에서 절대 지정할 수 없습니다. (*args**kwargs도 마찬가지입니다.)
  • /뒤에 인자가 있으면 /뒤에 쉼표를 지정해야 합니다. 이는 키워드 전용 매개변수로 전환됨을 나타내는 *뒤에 쉼표가 오는 것과 같습니다.
  • 이 구문은 *args**kwargs에 아무런 영향을 주지 않습니다.

추가 제한 사항

Argument Clinic은 내장 함수를 지정할 때 이 구문의 한 형태를 사용합니다. Argument Clinic은 이론적으로 불필요하지만 구현을 쉽게 해 주는 추가 제한 사항을 적용합니다. 구체적으로는 다음과 같습니다.

  • 현재 위치 전용 매개변수가 있는 함수에는 다른 종류의 매개변수도 사용할 수 없습니다. (가까운 시일 내에 이 제한은 다소 완화될 가능성이 높습니다.)
  • Argument Clinic은 “선택적 그룹”이라고 하는 추가 구문을 지원합니다. “선택적 그룹”은 그룹 단위로 지정하거나 지정하지 않아야 하는 위치 전용 매개변수의 연속된 집합입니다. 예를 들어 Argument Clinic에서 매개변수 네 개를 받는 함수를 정의하고, 이들이 모두 위치 전용이며 하나의 선택적 그룹에 속한다면, 함수를 호출할 때 인자를 0개 또는 4개 중 하나로 지정해야 합니다. 이는 Python의 레거시 라이브러리를 더 많이 지원하는 데 필요하지만, 이 PEP의 범위를 벗어나며 Python 언어에 실제로 포함하는 것은 권장하지 않습니다.

향후 구현자를 위한 참고 사항

향후 Python 버전에서 위치 전용 매개변수를 구현하기로 결정한다면 그 의미론을 보존하기 위해 추가 작업을 수행해야 합니다. 문제는 다음과 같습니다. 함수가 호출될 때 매개변수에 값이 전달되지 않았다는 사실을 매개변수에 어떻게 알릴 수 있을까요?

명백한 해결책은 매개변수가 인자에 매핑되지 않을 때 전달할 새로운 싱글턴 상수를 Python에 추가하는 것입니다. 이 값의 이름을 undefined로 하고, Undefined라는 특수 클래스의 싱글턴으로 만들 것을 제안합니다. 위치 전용 매개변수가 호출될 때 인자를 받지 못하면 해당 값은 undefined로 설정됩니다.

그러나 여기에는 또 다른 문제가 발생합니다. “이 위치 전용 매개변수는 인자를 받지 못했다”는 것과 “호출자가 이 매개변수에 undefined를 전달했다”는 것의 차이를 어떻게 알 수 있을까요?

함수의 인자로 undefined를 전달하는 것을 금지하는 것—예를 들어 예외를 발생시키는 것—이 바람직할 것입니다. 하지만 그렇게 하면 파이썬 속도가 느려질 것이며, “동의한 성인”(consenting adults) 규칙이 여기 적용되는 것으로 보입니다. 따라서 이를 금지하는 것은 강하게 만류되어야 하겠지만 완전히 막지는 말아야 할 것입니다.

그러나 사용자 함수가 매개변수의 기본값으로 undefined를 지정하는 것은 허용되어야(그리고 권장되어야) 합니다.

미해결 질문

파이썬에는 세 가지 유형의 매개변수가 있습니다:

  1. 위치 전용 매개변수,
  2. 위치 또는 키워드 매개변수, 그리고
  3. 키워드 전용 매개변수입니다.

파이썬은 함수가 2번과 3번을 모두 가지는 것을 허용합니다. 그리고 일부 내장 함수(예: range)는 1번과 3번을 모두 가지고 있습니다. 1번과 2번을 모두 가지는 함수를 두는 것이 타당합니까? 아니면 위 세 가지를 모두 가지는 것이 타당합니까?

감사의 말

위치 전용 매개변수와 위치 또는 키워드 매개변수 사이의 구분자로 ‘/’를 사용하자는 아이디어는 2012년 귀도 반 로섬(Guido van Rossum)의 제안에서 비롯되었습니다. [6]

왼쪽 옵션 그룹에 더 높은 우선순위를 부여한 것은 앨리사 코글런(Alyssa Coghlan)의 공로입니다. (PyCon US 2013에서의 대면 대화)