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를 받아들여야 한다는 데 동의했음을 의미합니다.

패치는 수정 번호 55430으로 Subversion에 커밋되었습니다.

참고 문헌