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

Python Enhancement Proposals

PEP 3129 – Klassen-Dekoratoren

Autor:
Collin Winter <collinwinter at google.com>
Status:
Final
Typ:
Standards Track
Erstellt:
01. Mai 2007
Python-Version:
3.0
Post-History:
07. Mai 2007

Inhaltsverzeichnis

Zusammenfassung

Dieses PEP schlägt Klassen-Dekoratoren vor, eine Erweiterung der Funktions- und Methoden-Dekoratoren, die in PEP 318 eingeführt wurden.

Begründung

Als Funktions-Dekoratoren ursprünglich für die Aufnahme in Python 2.4 debattiert wurden, galten Klassen-Dekoratoren dank Metaklassen als obskur und unnötig. Nach mehreren Jahren Erfahrung mit der Release-Serie Python 2.4.x und zunehmender Vertrautheit mit Funktions-Dekoratoren und deren Verwendungen bewerteten der BDFL und die Community Klassen-Dekoratoren neu und empfahlen ihre Aufnahme in Python 3.0 [1].

Der motivierende Anwendungsfall war, bestimmte Konstrukte einfacher auszudrücken und weniger von Implementierungsdetails des CPython-Interpreters abhängig zu machen. Während es möglich ist, Klassen-Dekorator-ähnliche Funktionalität mit Metaklassen auszudrücken, sind die Ergebnisse im Allgemeinen unangenehm und die Implementierung hochgradig fehleranfällig [2]. Darüber hinaus werden Metaklassen vererbt, während Klassen-Dekoratoren dies nicht tun, was Metaklassen für einige, spezifische Verwendungen von Klassen-Dekoratoren ungeeignet macht. Die Tatsache, dass groß angelegte Python-Projekte wie Zope diese wilden Verrenkungen durchmachten, um etwas wie Klassen-Dekoratoren zu erreichen, überzeugte den BDFL.

Semantik

Die Semantik und die Designziele von Klassen-Dekoratoren sind die gleichen wie für Funktions-Dekoratoren (PEP 318, PEP 318); der einzige Unterschied ist, dass Sie eine Klasse anstelle einer Funktion dekorieren. Die folgenden beiden Ausschnitte sind semantisch identisch

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


@foo
@bar
class A:
  pass

Für eine detaillierte Untersuchung von Dekoratoren verweisen Sie bitte auf PEP 318.

Implementierung

Die Anpassung der Python-Grammatik zur Unterstützung von Klassen-Dekoratoren erfordert die Änderung von zwei Regeln und das Hinzufügen einer neuen Regel

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

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

muss geändert werden zu

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

Das Hinzufügen von decorated ist notwendig, um eine Mehrdeutigkeit in der Grammatik zu vermeiden.

Die Python AST und der Bytecode müssen entsprechend geändert werden.

Eine Referenzimplementierung [3] wurde von Jack Diederich bereitgestellt.

Akzeptanz

Es gab praktisch keine Diskussion nach der Veröffentlichung dieses PEP, was bedeutet, dass alle zustimmten, dass es akzeptiert werden sollte.

Der Patch wurde als Revision 55430 in Subversion eingepflegt.

Referenzen


Quelle: https://github.com/python/peps/blob/main/peps/pep-3129.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT