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

Python 개선 제안 한국어 번역

PEP 3129 – 클래스 데코레이터

Author:
Collin Winter <collinwinter at google.com>
Status:
Final
Type:
Standards Track
Created:
01-May-2007
Python-Version:
3.0
Post-History:
07-May-2007

Table of Contents

번역·라이선스 안내

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

초록

이 PEP는 PEP 318에서 도입된 함수 및 메서드 데코레이터를 확장한 클래스 데코레이터를 제안합니다.

근거

함수 데코레이터를 Python 2.4에 포함할지 처음 논의할 때, 클래스 데코레이터는 메타클래스가 있으므로 모호하고 불필요한 것으로 여겨졌습니다. Python 2.4.x 릴리스 시리즈를 몇 년간 사용하면서 함수 데코레이터와 그 용도에 점점 익숙해지자, BDFL과 커뮤니티는 클래스 데코레이터를 다시 검토하고 Python 3.0에 포함할 것을 권고했습니다 [1].

이 제안의 계기가 된 사용 사례는 특정 구조를 더 쉽게 표현하고 CPython 인터프리터의 구현 세부 사항에 덜 의존하도록 만드는 것이었습니다. 메타클래스로도 클래스 데코레이터와 비슷한 기능을 표현할 수는 있지만, 그 결과는 대체로 보기 좋지 않고 구현은 매우 깨지기 쉽습니다 [2]. 또한 메타클래스는 상속되지만 클래스 데코레이터는 상속되지 않으므로, 단일 클래스에만 적용하는 일부 클래스 데코레이터 용도에는 메타클래스가 적합하지 않습니다. Zope 같은 대규모 Python 프로젝트가 클래스 데코레이터와 비슷한 것을 구현하려고 이처럼 무리한 우회를 거치고 있다는 사실이 BDFL을 설득했습니다.

의미론

클래스 데코레이터의 의미 체계와 설계 목표는 함수 데코레이터와 같습니다(PEP 318, PEP 318). 유일한 차이는 함수 대신 클래스를 데코레이트한다는 점입니다. 다음 두 코드 조각은 의미상 동일합니다:

class A:
  pass
A = foo(bar(A))


@foo
@bar
class A:
  pass

데코레이터에 대한 자세한 검토는 PEP 318을 참조하십시오.

구현

클래스 데코레이터를 지원하도록 Python 문법을 수정하려면 규칙 두 개를 변경하고 새 규칙 하나를 추가해야 합니다:

funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite

compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
               with_stmt | funcdef | classdef

다음과 같이 변경해야 합니다

decorated: decorators (classdef | funcdef)

funcdef: 'def' NAME parameters ['->' test] ':' suite

compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
               with_stmt | funcdef | classdef | decorated

문법의 모호성을 피하려면 decorated를 추가해야 합니다.

Python AST와 바이트코드도 이에 맞게 수정해야 합니다.

참조 구현 [3]은 Jack Diederich가 제공했습니다.

수락

이 PEP를 게시한 뒤 논의가 사실상 없었는데, 이는 모두가 이 PEP를 수락해야 한다는 데 동의했다는 뜻입니다.

패치는 Subversion에 리비전 55430으로 커밋되었습니다.

참고 문헌